bash grep regexp - 不包括子模式

时间:2015-09-24 14:34:02

标签: regex bash grep

我有一个用bash编写的脚本,我需要修改一个特定的grep命令。

一般来说,我有两种模式:A& B.有一个文本文件可以包含具有这些模式的所有可能组合的行,即: " xxxAxxx"," xxxBxxx"," xxxAxxxBxxx"," xxxxxx",其中" x"是任何人物。

我需要匹配包含ONLY" A"的所有行APART。

此刻,它已经完成了" grep -v (A)",但这是一个错误的轨道,因为这也会排除" xxxAxxxBxxx" - 对我来说没关系。这就是它需要修改的原因。 :)

棘手的部分是,这一个grep位于一个多重管道的中间。命令与许多其他greps,seds和awks里面。因此,形成更智能的模式将是最佳解决方案。其他人会在更改其他命令方面做更多的工作,甚至会影响代码的其他部分。

因此,问题是:是否有可能匹配模式并在一个grep中排除子模式,但允许它们出现在一行中?

实施例: 文件包含以下行:

fooTHISfoo
fooTHISfooTHATfoo
fooTHATfoo
foofoo

我需要匹配

fooTHISfooTHATfoo
fooTHATfoo
foofoo

" THIS"是不允许的。

4 个答案:

答案 0 :(得分:3)

您可以使用此awk命令:

awk '!(/THIS/ && !/THAT/)' file
fooTHISfooTHATfoo
fooTHATfoo
foofoo

或者通过反转布尔表达式:

awk '!/THIS/ || /THAT/' file
fooTHISfooTHATfoo
fooTHATfoo
foofoo

答案 1 :(得分:2)

您希望匹配包含B或不包含A的行。同样,删除包含A而非B的行。您可以在sed中执行此操作:

sed -e '/A/{;/B/!d}'

或者在这种特殊情况下:

sed '/THIS/{/THAT/!d}' file

答案 2 :(得分:1)

单独为grep而烦恼。但是,用awk调用替换它:使用“A”过滤掉行,除非有“B”

echo "xxxAxxx
xxxBxxx
xxxAxxxBxxx
xxxBxxxAxxx
xxxxxx" | awk '!/A/ || /B/'
xxxBxxx
xxxAxxxBxxx
xxxBxxxAxxx
xxxxxx

答案 3 :(得分:1)

$('.show_nav').click(function() { $('.level1').toggle(500); if (clicked != 1) { $('#FW_Logo').css("opacity", "0.5"); var clicked = 1; } else if (clicked == 1) { $('#FW_Logo').css("opacity", "1") var clicked = 0; } }); 解决方案。对 Lookaheads 使用 perl regexp grep)(看看是否有,有些解释here)。

-P