如何删除不包含模式 1 或模式 2 的行

How to delete line that doesn't contain pattern 1 or pattern 2

使用 sed 我可以做到这一点

sed -i '' '/myPattern/!d' file

但是我怎样才能让它与两种模式进行比较呢?所以它只删除不具有至少 2 个模式中的 1 个的行?

您可以对 -e 使用多个命令,并使用 -np 而不是 !d:

sed -n -i '' -e '/myPattern/p' -e '/myPattern2/p' file

通常我更喜欢 awk 来完成该任务,因为您可以使用布尔逻辑,例如:

awk '/pattern1/ || /pattern2/' file

awk '/pattern1/ && /pattern2/' file

等等。


顺便说一句,有了 GNU awk,您还可以就地编辑文件:

gawk -i inplace '/pattern1/||/pattern2/' file

这听起来像是 grep 的工作,例如:

seq 10 | grep -e 3 -e 7

输出:

3
7

我想我会选择不区分大小写的 (-i) 否定 (-v) grep 进行扩展 (-E) 交替 (|) 两种模式:

grep -viE `pattern1|pattern2' someFile

您可以使用:

删除不包含 alpha、beta 或 gama 的任何行。

sed -n '/alpha\|beta\|gama/p' < 1.txt > 2.txt