假设我想删除以下文件中的第二行和第三行,但不是第四行(那些匹配 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
.