正则表达式:匹配模式后跟一个空格但不匹配2个或更多空格或EOF

问题描述 投票:-1回答:6

输入字符串:

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

regex bash scripting
6个回答
2
投票

有了Perl,我会说:

perl -pe 's/(\d{4})(?= [^ ])/****/g' file

1
投票

如果我理解得很好,你可以试试

sed ':A;s/\(.*\)\([^ |\*]\)\([ |\*]*[ ][^ ][^ ]*[ ]*$\)/\1*\3/;tA' infile

1
投票

使用GNU sed:

sed -E 'h;s/^(([^ ]+ ){3})//;x;s/[^ ]*$//;s/[0-9]/*/g;G;s/\n//' file

输出:

**** **** **** 1234
**** **** **** 2234
**** **** **** 1232
**** **** **** 1232

见:man sed


0
投票

由于您没有向我们展示预期的输出,因此根据您的解释仅提供此解决方案。我相信你需要在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
投票

关于什么

^(?:(?:^| +)[0-9]{4})(?=[0-9]{4} $)

0
投票

我不确定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以及为此问题提供的其他人回答。抱歉。

© www.soinside.com 2019 - 2024. All rights reserved.