Sed 如何删除没有';不包含模式1或模式2

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我可以做到这一点

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]GNU
awk
的“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