【发布时间】:2014-02-24 19:27:27
【问题描述】:
假设我有几个字符串:str1 和 str2 和 str3。
- 如何找到包含所有字符串的行?
- 如何找到可以包含其中任何一个的行?
- 以及如何找到包含 str1 以及 str2 和 str3 [但不是两者都有的行?]?
【问题讨论】:
假设我有几个字符串:str1 和 str2 和 str3。
【问题讨论】:
这看起来像三个问题。将这些表达式组合在一起的最简单方法是使用多个管道。这并不丢人,特别是因为正则表达式(使用egrep)会很笨拙,因为您似乎暗示您想要顺序独立。
所以,按顺序,
grep str1 | grep str2 | grep str3
egrep '(str1|str2|str3)'
grep str1 | egrep '(str2|str3)'
您可以使用 egrep 以与顺序无关的方式执行“and”形式,但我认为您会发现更容易记住使用管道 grep 执行与顺序无关的 ands 并使用正则表达式执行与顺序无关的 or's。
【讨论】:
fgrep吗?
因为grep 不支持前瞻,所以您无法合理地执行“全部”或“此加上其中任何一个”的情况。使用 Perl。对于“任何”情况,它是egrep '(str1|str2|str3)' file。
“全部”情况下不合理的做法是:
egrep '(str1.*str2.*str3|str3.*str1.*str2|str2.*str1.*str3|str1.*str3.*str2)' file
即你建立排列。这当然是一件可笑的事情。
对于“这个加上其中任何一个”,类似地:
egrep '(str1.*(str2|str3)|(str2|str3).*str1)' file
【讨论】:
grep -E --color "string1|string2|string3...."
例如查找我们的系统是使用 AMD(svm) 还是 Intel(vmx) 处理器,如果它是 64bit(lm) lm 代表长模式 - 这意味着 64bit...
命令示例:
grep -E --color "lm|svm|vmx" /proc/cpuinfo
-E 是必须找到多个字符串
【讨论】:
就个人而言,我在 perl 中执行此操作,而不是尝试使用 grep 拼凑一些东西。
例如,对于第一个:
while (<FILE>)
{
next if ! m/pattern1/;
next if ! m/pattern2/;
next if ! m/pattern3/;
print $_;
}
【讨论】: