grep没有在xml上使用正则表达式返回预期结果

时间:2014-06-15 21:40:06

标签: regex grep centos

我正在某些xml上运行grep命令,它似乎误解了我正在尝试使用的正则表达式。

这是命令

grep '<ernm:NewReleaseMessage.*?>' ./075679942012_ORIGNAL.xml

似乎正在发生的事情是正则表达式的?>方面似乎没有导致匹配而不是匹配>

的第一次出现

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

默认情况下,grep使用基本正则表达式并将?视为文字问号。要将它视为正则表达式语法,您需要转义该字符。

grep '<ernm:NewReleaseMessage.*\?>' ./075679942012_ORIGNAL.xml

您可以使用-E选项将模式解释为 extended regular expression

grep -E '<ernm:NewReleaseMessage.*?>' ./075679942012_ORIGNAL.xml

注意:以上内容将返回与您的模式匹配的整行,如果您只想要匹配的文本,请使用-o选项,该选项仅打印匹配行的匹配部分。

grep -o '<ernm:NewReleaseMessage.*\?>' ./075679942012_ORIGNAL.xml

OR

grep -Eo '<ernm:NewReleaseMessage.*?>' ./075679942012_ORIGNAL.xml

答案 1 :(得分:2)

如果您希望将文本转到第一次出现的>字符,请尝试以下命令,

 grep -o '<ernm:NewReleaseMessage[^>]*>' file

如果您想要整行,请删除-o参数。

示例:

$ cat aa1.txt
<ernm:NewReleaseMessage blah> foo bar>
$ grep -o '<ernm:NewReleaseMessage[^>]*>' aa1.txt
<ernm:NewReleaseMessage blah>
带有grep

-o仅打印匹配的文字。

[^>]* - 不是>字符零或更多。所以它匹配>字符的第一次出现。