如何删除不包含模式 1 或模式 2 的行
How to delete line that doesn't contain pattern 1 or pattern 2
使用 sed 我可以做到这一点
sed -i '' '/myPattern/!d' file
但是我怎样才能让它与两种模式进行比较呢?所以它只删除不具有至少 2 个模式中的 1 个的行?
您可以对 -e
使用多个命令,并使用 -n
和 p
而不是 !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
使用 sed 我可以做到这一点
sed -i '' '/myPattern/!d' file
但是我怎样才能让它与两种模式进行比较呢?所以它只删除不具有至少 2 个模式中的 1 个的行?
您可以对 -e
使用多个命令,并使用 -n
和 p
而不是 !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