Regex grep-egrep多字符串

Regex grep-egrep多字符串,regex,grep,Regex,Grep,假设我有几个字符串:str1、str2和str3 如何查找包含所有字符串的行 如何找到可以包含其中任何一个的行 以及如何找到含有str1和str2或str3的行[但不是两者都有?] 就我个人而言,我用perl来做这件事,而不是用grep来拼凑一些东西 例如,对于第一个: while (<FILE>) { next if ! m/pattern1/; next if ! m/pattern2/; next if ! m/pattern3/; print $_

假设我有几个字符串:str1、str2和str3

  • 如何查找包含所有字符串的行
  • 如何找到可以包含其中任何一个的行
  • 以及如何找到含有str1和str2或str3的行[但不是两者都有?]

就我个人而言,我用perl来做这件事,而不是用grep来拼凑一些东西

例如,对于第一个:

while (<FILE>)
{
   next if ! m/pattern1/;
   next if ! m/pattern2/;
   next if ! m/pattern3/;

   print $_;
}
while()
{
下一个if!m/pattern1/;
下一个if!m/pattern2/;
下一个if!m/pattern3/;
打印美元;
}

您不能合理地执行“全部”或“这加上其中任何一个”情况,因为
grep
不支持前瞻。使用Perl。对于“any”情况,它是egrep(str1 | str2 | str3)文件

处理“所有”案件的不合理方式是:

i、 你建立了排列。当然,这是一件荒谬的事情

对于“这个加上其中任何一个”,类似地:

egrep '(str1.*(str2|str3)|(str2|str3).*str1)' file

这看起来像是三个问题。将这些类型的表达式放在一起的最简单方法是使用多个管道。这并没有什么丢脸的,特别是因为正则表达式(使用)将是笨拙的,因为您似乎暗示您想要顺序独立性

那么为了,

  • grep str1 | grep str2 | grep str3

  • 白鹭(str1 | str2 | str3)'

  • grep str1 | egrep'(str2 | str3)'

  • 您可以使用egrep以顺序独立的方式执行“and”形式,但我认为您会发现使用管道grep执行顺序独立and和使用正则表达式执行顺序独立or更容易记忆。

    grep-E--color“string1 | string2 | string3…”

    例如,要确定我们的系统使用的是AMD(svm)还是Intel(vmx)处理器,如果是64位(lm),lm代表长模式-这意味着64位

    命令示例:

    grep-E——颜色“lm | svm | vmx”/proc/cpuinfo


    -E必须找到多个字符串

    -1:问题不是:什么是最好的工具,而是如何使用grep。答案是“不要使用grep,你会疯狂尝试”@quoso:在Unix程序员中,“grep”可以具体指grep程序,或者是在文本体中搜索字符串或模式的一般问题。不清楚Tim打算使用哪种用法,所以我认为Paul Tomblin的答案是正确的。您的perl答案并不简洁,因为它可以在命令行上完成(使用perl-pe'/expr/&&/expr/&&&&/expr/),它也不能回答实际问题。@Paul:对不起,“易于理解”和“perl”不是可链接的符号。3不符合要求“但不是两者都有"要求,但这一要求很难满足。您需要在替换的每一侧都有一个精心制作的前缀和后缀,以避免另一个字符串出现在行中的任何其他位置。@Michael E:“但不是同时出现”位是斜体,后面有一个问号,因为在编辑问题时,我不确定“艾斯克在找,”土拨鼠写下了他的(好)回答之前,我应该用一个注释或修正来修正/修改这个问题。也许,我的评论不再是相关的。我会把它放在一边,这样你的文章就不会脱离上下文。我没有看过这个问题的编辑历史。“土拨鼠:你有没有考虑过<代码> FGRP< <代码>?”乔纳森-我相信只有FRGP。使用固定参数字符串,而不是正则表达式。
    egrep '(str1.*(str2|str3)|(str2|str3).*str1)' file