我有一个用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"是不允许的。
答案 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