如何让egrep匹配^每行(应该是)

时间:2013-07-02 13:52:04

标签: regex grep

我有一个包含以下行的文件:

SOME COMMAND 34 XXXXX ;
; a comment which may contain a : 
      sometext001 : X00 : 1 ;
                  : X01 : 1 ;
                  : X11 : 1 ;

想要用grep / egrep检索sometext001

使用正则表达式^\s*[^:\s;]+\s*:

(用文字:从行的开头开始,有一些或没有空格,后跟至少一个字符不是空格,冒号或分号后跟一些或没有空格后跟冒号)

如果启用多行支持,我可以使用在线正则表达式测试器http://regexr.com?35eam来匹配文本(包括以下:)。

我的印象是grep / egrep无论如何都是逐行工作的,那么为什么在与包含这个例子的文件上使用egrep时正则表达式不起作用?

是否有另一种方法可以使用egrep获得所需的结果,或者,如果不可能,还可以使用另一个可从shell脚本调用的单线程?

更新虽然建议将正则表达式更改为^[[:space:]]*[^[:space:];]+[[:space:]]*:与指定的行匹配,但它仍会在该行匹配两次,一次用于sometext001 :,一次用于{ {1}}在使用egrep的-o选项时很明显。 怎么解决这个问题?

更新:测试文件中包含上面给出的文字。命令行是X00 :(也尝试没有()对)。输出

egrep -o '^([[:space:]]*[^:[:space:];]+[[:space:]]*:)' test.txt

3 个答案:

答案 0 :(得分:2)

默认情况下,

egrep使用POSIX EREs,而那些不识别\s和其他Perl风格的缩写。尝试

^[[:space:]]*[^:[:space:];]+[[:space:]]*:

答案 1 :(得分:1)

你应该更好地使用-P(像正则表达式开关一样)使用正则表达式:

grep -P '^\s*[^:\s;]+\s*:'

答案 2 :(得分:0)

使用gnu grep:

grep -Po '^\s*\K[^\s:;]*(?= :)'

你的例子:

kent$  echo "SOME COMMAND 34 XXXXX ;
; a comment which may contain a : 
      sometext001 : X00 : 1 ;
                  : X00 : 1 ;
                  : X11 : 1 ;"|grep -Po '^\s*\K[^\s:;]*(?= :)'
sometext001