Unix 在文件中搜索精确的多个模式,如果模式匹配,则删除行

Unix 在文件中搜索精确的多个模式,如果模式匹配,则删除行,unix,sed,awk,grep,Unix,Sed,Awk,Grep,例如,包含如下内容的文件,其中不包含任何重复条目: 100 10012 12345 12387 123 123456344 我想在上面的文件中搜索100和12345,如果模式匹配,则删除该行 我还想在一个命令中执行此操作。我只需执行此操作即可 egrep -v '^(100|12345)$' file.in > file.out 或者,用sed sed -n '/^\(100\|12345\)$/!p' file.in > file.out 您甚至不需要第二个文件: sed -

例如,包含如下内容的文件,其中不包含任何重复条目:

100
10012
12345
12387
123
123456344
我想在上面的文件中搜索
100
12345
,如果模式匹配,则删除该行

我还想在一个命令中执行此操作。

我只需执行此操作即可

egrep -v '^(100|12345)$' file.in > file.out
或者,用sed

sed -n '/^\(100\|12345\)$/!p' file.in > file.out
您甚至不需要第二个文件:

sed -ni '/^\(100\|12345\)$/!p' file.in
(请参阅注释;严格来说,创建一个临时文件,然后替换输入文件,但这对用户来说是透明的)

如您所见,正则表达式或多或少保持不变(除了不需要在egrep中转义()|)。如果一行中有多个单词,但只想匹配整个单词,则可以使用以下sed正则表达式:

sed -n '/\<\(100\|12345\)\>/!p' file.in > file.out

如果数字必须完全匹配,则可以使用如下扩展的grep模式:

 grep -v -E '^(100|12345)$' inputfile
这表示:打印所有不是100或12345的行。如果数字只需要在行首匹配,请使用

 grep -v -E '^(100|12345)' inputfile
如果它们可以在任何地方匹配,请使用

 grep -v -E '(100|12345)' inputfile

单向使用
sed

sed '/^\(100\|12345\)$/d' file.txt 
结果:

10012
12387
123
123456344

我还想补充一点,如果你想让它匹配
100
而不是说
10012
,你应该添加
-w
标志来指示grep匹配整个单词。对不起,它不起作用。此命令还将删除10012和123456344。使用此命令后的输出是:::Desktop$egrep-v'(^100 | 12345)'Untitled\Document 12387 123“您不需要第二个文件”不正确,因为
sed-i
使用临时文件。@williampersell严格地说,是的;但是,从用户的角度来看,不会永久创建其他文件。为什么这个问题被否决了?在评论中解释一下就好了。
10012
12387
123
123456344
sed '/\(100\|12345\)/d' file.txt