Sed 如何删除没有';不包含模式1或模式2
使用sed我可以做到这一点Sed 如何删除没有';不包含模式1或模式2,sed,bsd,Sed,Bsd,使用sed我可以做到这一点 sed -i '' '/myPattern/!d' file 但是我怎样才能将它与两种模式进行比较呢?因此,它只删除至少没有两种模式中的一种的行。您可以将多个命令与-e一起使用,并使用-n和p而不是!d: sed -n -i '' -e '/myPattern/p' -e '/myPattern2/p' file 通常我更喜欢awk,因为您可以使用布尔逻辑,例如: awk '/pattern1/ || /pattern2/' file 或 等等 顺便说一句,有
sed -i '' '/myPattern/!d' file
但是我怎样才能将它与两种模式进行比较呢?因此,它只删除至少没有两种模式中的一种的行。您可以将多个命令与
-e
一起使用,并使用-n
和p
而不是!d
:
sed -n -i '' -e '/myPattern/p' -e '/myPattern2/p' file
通常我更喜欢awk,因为您可以使用布尔逻辑,例如:
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-n'/alpha\| beta\|gama/p'<1.txt>2.txt
我认为grep
的一个版本会更合适,因为您是在线操作的,类似于grep-v'pattern1 | pattern2'文件
。根据您的grep
版本或您的模式,您可能必须使用egrep
。可能重复感谢它看起来正是我想要的。有什么方法可以使它不区分大小写吗?我应该补充一下,除此之外[Pp][Aa][Tt][Tt][Ee][Rr][Nn]GNUawk
的“inplace”实际上是“制作一个隐藏的临时文件,然后在旧文件上重命名它”。:“对于处理的每个常规文件,扩展将标准输出重定向到一个临时文件,该临时文件配置为具有与原始文件相同的所有者和权限。处理文件后,扩展将标准输出恢复到其原始目标…”因此,如果您的空间受限,例如,这对制作临时副本毫无帮助。@AndrewHenle这对sed也是如此。@Chris你有两个选择。使用tolower()
,就像这样:awk'{line=tolower($0)}line~/pattern1/&&line~/pattern2/'文件
,或者,如果您有GNU-awk,您可以设置IGNORECASE=1
,我通常同意当用例是其中一个模式应该匹配时。我喜欢使用awk
,因为您还可以指定逻辑and条件或更复杂的逻辑。
sed -n '/alpha\|beta\|gama/p' < 1.txt > 2.txt