正则表达式:匹配模式后跟一个空格但不匹配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个空格。)

小提琴:https://regex101.com/r/VzQf3D/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

小提琴:https://regexr.com/3ike0


如果你使用sed这个正则表达式,根据不可能的非捕获组

how do you specify non-capturing groups in sed?

https://stackoverflow.com/a/36546377/7505395以及为此问题提供的其他人回答。抱歉。

以上是关于正则表达式:匹配模式后跟一个空格但不匹配2个或更多空格或EOF的主要内容,如果未能解决你的问题,请参考以下文章

匹配 3 个或更多连续连续字符和连续相同字符的正则表达式

正则表达式:如何访问一个组的多个匹配项? [复制]

正则表达式匹配任何字符 5 次或更多次

Linux命令也有外挂

正则表达式 匹配第一个空格

正则表达式匹配一段里的第一个空格?