我有一个包含以下行的文件:
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
答案 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