Grep没有显示结果,在线正则表达式测试仪确实如此

slh*_*hck 4 regex grep

我对grep的行为相当缺乏经验.我有一堆XML文件包含这样的行:

<identifier type="abc">abc:def.ghi/g1234.ab012345</identifier>
<identifier type="abc">abc:def.ghi/g5678m.ab678901</identifier>
Run Code Online (Sandbox Code Playgroud)

我想在斜杠后获取标识符部分并使用RegexPal构造一个正则表达式:

[a-z]\d{4}[a-z]*\.[a-z]*\d*
Run Code Online (Sandbox Code Playgroud)

它突出了我想要的一切.完善.现在当我在同一个文件上运行grep时,我没有得到任何结果.正如我所说,我真的不太了解grep,所以我尝试了所有不同的组合.

grep [a-z]\d{4}[a-z]*\.[a-z]*\d* test.xml
grep "[a-z]\d{4}[a-z]*\.[a-z]*\d*" test.xml
egrep "[a-z]\d{4}[a-z]*\.[a-z]*\d*" test.xml
grep '[a-z]\d{4}[a-z]*\.[a-z]*\d*' test.xml
grep -E '[a-z]\d{4}[a-z]*\.[a-z]*\d*' test.xml
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Jon*_*Jon 9

你的正则表达式与输入不匹配.让我们分解一下:

  • [a-z] 火柴 g
  • \d{4} 火柴 1234
  • [a-z]* 不匹配 .

另外,我相信grep和家人不喜欢\d语法.尝试其中一个[0-9][:digit:]

最后,使用正则表达式时,喜欢egrepgrep.我不记得确切的细节,但egrep支持更多的正则表达式运算符.此外,在许多shell中(包括你提到的OS X上的bash,使用单引号而不是双引号,否则*在grep看到它之前shell将扩展到当前目录中的文件列表(以及其他shell元字符)也将得到扩展.)Bash不会触及单引号中的任何内容.


Kob*_*obi 5

grep\d默认不支持.要匹配数字,请使用[0-9]或允许Perl兼容的正则表达式:

$ grep -P "[a-z]\d{4}[a-z]*\.[a-z]*\d*" test.xml
Run Code Online (Sandbox Code Playgroud)

要么:

$ egrep "[a-z][0-9]{4}[a-z]*\.[a-z]*[0-9]*" test.xml
Run Code Online (Sandbox Code Playgroud)