Egrep正则表达式的结尾与$无法正确匹配

时间:2013-10-20 05:51:25

标签: regex shell unix sh

我的模式需要有三个单词,其中有一个SPACE字符分隔每行中的三个标记。

例如

inherit class3 class4
inherit class35 class5
implement class3 interface1
aggregate class3 class5

我的代码是egrep -i "^[0-9a-z]+\ [0-9a-z]+\ [0-9a-z]+$" "$input2"

这仍然与它没有匹配,并且最后没有输出$,但是如果我删除$,它会输出每行中有超过3个令牌的行。我一直试图让它在很长一段时间内完美运行,但它不起作用。感谢。

测试文件有此

d d d d
 dfsdfg afegsdfh asfg
efgfah afgadfg adfsg 
awg  awg wga
wrhg warg  wrgrw
awdg afsg
sdg

asdg asdg asdg asdg

4 个答案:

答案 0 :(得分:1)

给定测试数据,没有行匹配正则表达式。它的行为应该如此。你可能认为它会匹配第三行,但它不能,因为有一个尾随空格,所以第三个标记不会紧跟在行尾。

当你从正则表达式模式中删除行尾字符时,它确实没有这个约束,因此,只要该行以三个以空格分隔的标记开头,它就会匹配。因此,如提问者所述,这些行将打印出来。

答案 1 :(得分:1)

您的测试文件似乎没有任何与搜索完全匹配的模式... 匹配的一行末尾有一个空格。

enter image description here

要解决此问题,请在搜索中使用* ...

添加一些可选空格

答案 2 :(得分:0)

$是行尾的正则表达符号。因此,如果你想要以$结尾的东西,你应该反斜杠(当你在括号附近使用时) - \ $。正如我所看到的,你的命令实际上应该以\ $$

结束

答案 3 :(得分:0)

试试这个:

 egrep -i "^\ *[0-9a-z]+\ [0-9a-z]+\ [0-9a-z]+\ *$"

您尝试的命令无法正常工作,因为当开头或结尾有空格时,它不会捕获这些情况。