Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Grep不显示结果,在线正则表达式测试程序显示结果_Regex_Grep - Fatal编程技术网

Regex Grep不显示结果,在线正则表达式测试程序显示结果

Regex Grep不显示结果,在线正则表达式测试程序显示结果,regex,grep,Regex,Grep,我对格雷普的行为相当缺乏经验。我有一堆XML文件,其中包含以下行: <identifier type="abc">abc:def.ghi/g1234.ab012345</identifier> <identifier type="abc">abc:def.ghi/g5678m.ab678901</identifier> 它突出了我想要的一切。完美的现在,当我在同一个文件上运行grep时,我没有得到任何结果。正如我所说的,我真的不太了解grep,所

我对格雷普的行为相当缺乏经验。我有一堆XML文件,其中包含以下行:

<identifier type="abc">abc:def.ghi/g1234.ab012345</identifier>
<identifier type="abc">abc:def.ghi/g5678m.ab678901</identifier>
它突出了我想要的一切。完美的现在,当我在同一个文件上运行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

我做错了什么?

您的正则表达式与输入不匹配。让我们把它分解一下:

  • [a-z]
    匹配
    g
  • \d{4}
    匹配
    1234
  • [a-z]*
    不匹配
另外,我相信grep和family不喜欢
\d
语法。请尝试
[0-9]
[:digit:][/code>


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

首先,不要使用regexp进行xml/html解析。请参阅这篇经典文章

您可以使用以下命令:

$ cat file
<identifier type="abc">abc:def.ghi/g1234.ab012345</identifier>

# Use -P option to enable Perl style regex \d.
$ grep -P  '[a-z]\d{4}[a-z]*\.[a-z]*\d*' file
<identifier type="abc">abc:def.ghi/g1234.ab012345</identifier>

# to get only the part of the input that matches use -o option:
$ grep -P -o '[a-z]\d{4}[a-z]*\.[a-z]*\d*' file
g1234.ab012345

# You can use [0-9] inplace of \d and use -E option.
$ grep -E -o '[a-z][0-9]{4}[a-z]*\.[a-z]*[0-9]*' file
g1234.ab012345
$ 
$cat文件
abc:def.ghi/g1234.ab012345
#使用-P选项启用Perl样式的regex\d。
$grep-P'[a-z]\d{4}[a-z]*\.[a-z]*\d*'文件
abc:def.ghi/g1234.ab012345
#要仅获取与之匹配的输入部分,请使用-o选项:
$grep-P-o'[a-z]\d{4}[a-z]*\.[a-z]*\d*'文件
g1234.ab012345
#您可以使用[0-9]代替\d并使用-E选项。
$grep-E-o'[a-z][0-9]{4}[a-z]*\[a-z]*[0-9]*'文件
g1234.ab012345
$ 
grep使用“基本”正则表达式:(摘自手册页)

还取决于您在“*”字符中执行的shell可能会被扩展。

尝试以下操作:


[a-z]\d{5}[.][a-z]{2}\d{6}

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

$ grep -P "[a-z]\d{4}[a-z]*\.[a-z]*\d*" test.xml
或:


在grep中尝试以下表达式:

[a-z]\d{4}[a-z]*\.[a-z]*\d*

抱歉,我有一个输入错误。测试文件是正确的,正则表达式在在线工具中匹配。有一个输入错误,抱歉。现在它被更正了。正则表达式在在线工具中仍然匹配。非常感谢。
[0-9]
帮助了我。非常感谢!
egrp
岩石。我很困惑。
[a-z]*
不匹配
,但它是可选的,因此它匹配0个字符,然后正则表达式的下一位匹配点。这就是它在正则表达式测试站点上工作的原因。我认为实际问题是像您建议的那样使用扩展正则表达式。我在OS X上使用的是bash 3.2,-E开关也没有帮助(在我的原始问题中添加了它)我没有试图解析标记或任何东西。这真的不重要。无法抵抗诱惑;-)问题是grep不支持\d符号,除非给出-P(perl),否则使用[0-9]或posix代替是的,谢谢,这将是我想要的解决方案;)好的,改变需求,然后试试这个:[a-z][0-9]{4}[1-z]*[.][a-z]{2}[0-9]{6}
$ grep -P "[a-z]\d{4}[a-z]*\.[a-z]*\d*" test.xml
$ egrep "[a-z][0-9]{4}[a-z]*\.[a-z]*[0-9]*" test.xml
[a-z]\d{4}[a-z]*\.[a-z]*\d*