Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/android-studio/3.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
在Ubuntu上的grep中,如何仅显示与正则表达式匹配的字符串?_Ubuntu_Grep - Fatal编程技术网

在Ubuntu上的grep中,如何仅显示与正则表达式匹配的字符串?

在Ubuntu上的grep中,如何仅显示与正则表达式匹配的字符串?,ubuntu,grep,Ubuntu,Grep,我基本上是用一个正则表达式进行grepping。在输出中,我只希望看到与我的reg exp匹配的字符串 在一堆XML文件中(大多数是单行文件,一行中包含大量数据),我希望获得所有以MAIL开头的单词 另外,我希望shell上的grep命令只给出匹配的单词,而不是整行(在本例中是整个文件) 我该怎么做 我试过了 grep -Gril MAIL_* . grep -Grio MAIL_* . grep -Gro MAIL_* . 只输出匹配的文本,而不是完整的行,但问题可能是您的正则表达式不够严格

我基本上是用一个正则表达式进行grepping。在输出中,我只希望看到与我的reg exp匹配的字符串

在一堆XML文件中(大多数是单行文件,一行中包含大量数据),我希望获得所有以MAIL开头的单词

另外,我希望shell上的grep命令只给出匹配的单词,而不是整行(在本例中是整个文件)

我该怎么做

我试过了

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表达式,它选择文档中的所有属性,然后输出它们的值

现在我想要的单词类型在文件type=“MAIL\u ABC\u CDE”type=“MAIL\u XXX\u AAA\u AAA”等中出现了,我应该使用什么样的注册表项?有什么想法吗?很好。这很有效,但是一个简单的问题是,如果我知道邮件内容在文件中以type=“MAIL”或>MAIL.*<的形式存在,我该怎么办?有什么帮助吗?我不明白。你能重新措辞你的问题吗?你想看到你邮件周围的人物吗?比如,您想在grep命令的输出中看到“和”吗?如果您的邮件*只能包含字母字符(a-z),那么您可以将regexp更改为“邮件”[[:alpha:]*”
$ 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