正则表达式:匹配模式后跟一个空格但不匹配2个或更多空格或EOF
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式:匹配模式后跟一个空格但不匹配2个或更多空格或EOF相关的知识,希望对你有一定的参考价值。
输入字符串:
1234 5678 9101 1234
2999 5178 9101 2234
9999 5628 9201 1232
8888 3678 9101 1232
上面的输入字符串在第1行,第2行和第3行之后有空格。最后一位数后面的每一行都有空格,然后新行开始,最后一行除外。
最后一行以最后一个字符(数字'2')结束,之后没有其他内容。
必需匹配:我想只匹配每行中前三个数字块(匹配不应包括块之间的单个空格)。
使用sed的预期输出:
**** **** **** 1234
**** **** **** 2234
**** **** **** 1232
**** **** **** 1232
我的方法:我使用负向lookbehind(我知道sed不支持环绕声断言)d{4}(?! {2,})
匹配,在前三行中,只匹配前三个数字块但在第四行匹配所有数字块(显然是最后一个)最后一位数后行没有2个空格。)
有了Perl,我会说:
perl -pe 's/(d{4})(?= [^ ])/****/g' file
如果我理解得很好,你可以试试
sed ':A;s/(.*)([^ |*])([ |*]*[ ][^ ][^ ]*[ ]*$)/1*3/;tA' infile
使用GNU sed:
sed -E 'h;s/^(([^ ]+ ){3})//;x;s/[^ ]*$//;s/[0-9]/*/g;G;s/
//' file
输出:
**** **** **** 1234 **** **** **** 2234 **** **** **** 1232 **** **** **** 1232
见:man sed
由于您没有向我们展示预期的输出,因此根据您的解释仅提供此解决方案。我相信你需要在Input_file的每一行中前3列,如果是,那么下面的内容可以帮助你。如果您的要求不同,那么请在帖子中向我们展示预期的输出,并在代码标签中提供更多详细信息。
awk '{print $1,$2,$3}' Input_file
输出如下。
1234 5678 9101
2999 5178 9101
9999 5628 9201
8888 3678 9101
编辑:看到您编辑的帖子,如果您在输出中不需要3列之间的空格,那么以下可能会帮助您。
awk '{print $1 $2 $3}' Input_file
关于什么
^(?:(?:^| +)[0-9]{4})(?=[0-9]{4} $)
我不确定bash,但对于正常的正则表达式,我会使用
^(?: *)(d{4})(?: +)(d{4})(?: +)(d{4}) # with multiline flag
说明:
^ is line start
(?: *) is a non capturing group of any number of spaces
(d{4}) is a capturing group of 4 digit
(?: +) is a non capturing group of one or more number of spaces
(d{4}) is a capturing group of 4 digit
(?: +) is a non capturing group of one or more number of spaces
(d{4}) is a capturing group of 4 digit
如果你使用sed
这个正则表达式,根据不可能的非捕获组
how do you specify non-capturing groups in sed?
https://stackoverflow.com/a/36546377/7505395以及为此问题提供的其他人回答。抱歉。
以上是关于正则表达式:匹配模式后跟一个空格但不匹配2个或更多空格或EOF的主要内容,如果未能解决你的问题,请参考以下文章