在Ubuntu上的grep中,如何仅显示与正则表达式匹配的字符串?
我基本上是用一个正则表达式进行grepping。在输出中,我只希望看到与我的reg exp匹配的字符串 在一堆XML文件中(大多数是单行文件,一行中包含大量数据),我希望获得所有以MAIL开头的单词 另外,我希望shell上的grep命令只给出匹配的单词,而不是整行(在本例中是整个文件) 我该怎么做 我试过了在Ubuntu上的grep中,如何仅显示与正则表达式匹配的字符串?,ubuntu,grep,Ubuntu,Grep,我基本上是用一个正则表达式进行grepping。在输出中,我只希望看到与我的reg exp匹配的字符串 在一堆XML文件中(大多数是单行文件,一行中包含大量数据),我希望获得所有以MAIL开头的单词 另外,我希望shell上的grep命令只给出匹配的单词,而不是整行(在本例中是整个文件) 我该怎么做 我试过了 grep -Gril MAIL_* . grep -Grio MAIL_* . grep -Gro MAIL_* . 只输出匹配的文本,而不是完整的行,但问题可能是您的正则表达式不够严格
grep -Gril MAIL_* .
grep -Grio MAIL_* .
grep -Gro MAIL_* .
只输出匹配的文本,而不是完整的行,但问题可能是您的正则表达式不够严格或贪婪,实际上与整个文件匹配。首先,对于与Ubuntu一起安装的GNU grep,-G标志(使用基本正则表达式)是默认值,因此您可以省略它,但更好的是,将扩展regexp与-E一起使用 -r标志意味着在目录的文件中进行递归搜索,这是您所需要的 并且,您可以使用-o标志来打印行的匹配部分。此外,要省略文件名,需要-h标志 唯一的错误是正则表达式本身。您在*之前错过了字符规范。您的命令应如下所示:
grep -Ehro 'MAIL_[^[:space:]]*' .
示例输出(非递归):
请尝试以下命令
grep -Eo 'MAIL_[[:alnum:]_]*'
从您对Thor答案的评论来看,您似乎还想区分
MAIL.*
文本是文本节点还是属性,而不仅仅是在XML文档中出现时将其隔离。Grep无法解析XML
命令行xml解析器是可用的。它是用Ubuntu打包的
在此示例文件上使用它示例文件:
$ cat test.xml
<some_root>
<test a="MAIL_as_attribute">will be printed if you want matching attributes</test>
<bar>MAIL_as_text will be printed if you want matching text nodes</bar>
<MAIL_will_not_be_printed>abc</MAIL_will_not_be_printed>
</some_root>
以及选择属性:
$ xmlstarlet sel -t -m '//*[@*]' -v '@*' -n test.xml | grep -Eo 'MAIL_[^[:space:]]*'
MAIL_as_attribute
简要说明:
是一个XPath表达式,它选择文档中的所有元素,并/*
输出其子文本节点的值,因此除文本节点外的所有内容都将被过滤掉text()
是一个XPath表达式,它选择文档中的所有属性,然后输出它们的值/*[@*]
$ cat test.xml
<some_root>
<test a="MAIL_as_attribute">will be printed if you want matching attributes</test>
<bar>MAIL_as_text will be printed if you want matching text nodes</bar>
<MAIL_will_not_be_printed>abc</MAIL_will_not_be_printed>
</some_root>
$ xmlstarlet sel -t -m '//*' -v 'text()' -n test.xml | grep -Eo 'MAIL_[^[:space:]]*'
MAIL_as_text
$ xmlstarlet sel -t -m '//*[@*]' -v '@*' -n test.xml | grep -Eo 'MAIL_[^[:space:]]*'
MAIL_as_attribute