1

我有一个包含这些行的文件:

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

并想sometext001用 grep/egrep 检索。

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

(换句话说:从行首开始,有一些或没有空格,后跟至少一个字符,不是空格、冒号或分号,然后是一些或没有空格,然后是冒号)

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

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

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

更新:虽然建议更改正则表达式以^[[:space:]]*[^[:space:];]+[[:space:]]*:匹配指定的行,但它仍然匹配该行中的两次,一次是sometext001 :一次,一次X00 :是在使用 egrep 的 -o 选项时很明显。如何解决这个问题?

更新:测试文件包含上面给出的文本。命令行是egrep -o '^([[:space:]]*[^:[:space:];]+[[:space:]]*:)' test.txt(也尝试过没有 () 对)。输出是

      sometext001 :
X00 :        
4

3 回答 3

2

egrep默认情况下使用POSIX ERE,那些不识别\s和其他 Perl 风格的简写。尝试

^[[:space:]]*[^:[:space:];]+[[:space:]]*:
于 2013-07-02T13:56:25.153 回答
1

您应该更好地使用-P(perl like regex switch)与您拥有的正则表达式:

grep -P '^\s*[^:\s;]+\s*:'
于 2013-07-02T13:57:35.370 回答
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
于 2013-07-02T13:59:02.680 回答