我很难为Grep和Regex找出一个非常具体的用例。我找了很多遍,似乎找不到答案。
我希望在根目录中递归地运行Grep,其中包含数百个不同程序的目录。我希望输出打印到一个文本文件,并列出所有文件的名称,这些文件与某些regex匹配。具体来说,以下是我需要用英语做的事情:
查找包含文本stringA和"stringB“或'stringB‘的所有文件,并将每个文件的文件路径打印到添加了上下文的输出文本文件中。对于这两个stringB部分,引号很重要,我只想找到带有单引号或双引号的stringB文件。换句话说,
包含没有引号的stringA和单引号或双引号的stringB的所有文件。
任何帮助都是感激的,谢谢!
编辑:很抱歉问了一个糟糕的问题:)
我做了一些研究,并找出了其中的一部分。我已经找出了寻找我正在寻找的字符串的准则。实际的字符串是"ATA“。要查找全局的、不区分大小写的引用,并且在字符串的两边都有部分或无空格的引号,我们可以使用:
/['"]\s*ATA\s*['"]/gi我还需要找到的第一个字符串是一个函数调用:调用wflnkmod(其中的正则表达式是:
/call\swflnkmod\(/gi现在,我只需要弄清楚如何搜索一个文件,并确保其中每个文件都有一个实例,然后找出grep命令来递归搜索所有文件,并将它们打印到输出文件中!
发布于 2017-11-17 21:14:09
解决方案
应该做到这一点(需要用要搜索的目录替换<dir>):
grep -r -i -l "stringA" <dir> | xargs grep -i -l -E "'stringB'|\"stringB\""解释
上面的行首先搜索stringA。生成的文件列表被管道传输到xargs中,指定的命令(grep -i -l -E "'stringB'|\"stringB\"")将使用stdin提供的附加参数(包含stringA的文件列表)调用。
grep选项:
-r, --recursive (自我解释)-i, --ignore-case搜索不区分大小写-l, --files-with-matches只打印与给定模式匹配的文件的文件名-E将模式解释为扩展正则表达式您尝试过的表达式的两个主要问题是:
[]。[]允许您定义字符集,例如,[abcd]匹配指定字符之一。")中的某些内容,则需要转义引用字符串中的双引号:\"在引用的字符串中生成"。如果您根本没有引用您的表达式,那么(也需要转义。发布于 2017-11-17 21:09:06
对于AND搜索,最好是链接grep,可以处理OR。
假设我们在寻找单词cat和"ata"或'ata'。如果你只对文件名感兴趣,而不是真正的匹配.
grep -wilm1 cat file* | xargs grep -wilEm1 "'ata'|\"ata\""
file1
file2搜索全文匹配-w (非子字符串),在第一次匹配-m1之后退出,忽略大小写(-i)。OR需要-E标志。-l只打印文件名。
下面是用于测试的文件。
==> file1 <==
cat
fat hat "ata"
==> file2 <==
cat fat hat 'ata'
==> file3 <==
cat fat hat ata
==> file4 <==
category fat hat atahttps://stackoverflow.com/questions/47358807
复制相似问题