如何删除匹配 foo 但不匹配 bar 的行?

如何删除匹配 foo 但不匹配 bar 的行?

假设我想删除以下文件中的第二行和第三行,但不是第四行(那些匹配 foo 但不匹配 bar 的行),我可以使用例如 sed 轻松做到这一点吗?

text
foo some more text
even more foo text
some foo text with bar

答案1

这似乎对我有用:

sed '/foo/{/bar/!d;}' my_file

答案2

几种替代方案:

awk '! (/foo/ && !/bar/)'
awk '/bar/ || !/foo/'
sed -e /bar/b -e /foo/d
sed '/foo/{/bar/!d;}'
perl -ne 'print unless /foo/ && !/bar/'

grep具有 PCRE 支持的GNU :

grep -vP '^(?!.*bar).*foo'

(使用PCRE的负前瞻运算符 (?!...))。

其中,仅perl允许使用该选项进行可移植的就地编辑(在perl安装了任何版本的系统上)-i

标准sed不进行就地编辑。然而,sed最近的一些 BSD 允许使用该-i ''选项,而 GNU 则sed允许使用-i(均以perl)作为扩展。

GNU 的最新版本awk也允许使用-i inplace.

相关内容