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

Pri*_*arg 3 unix awk grep sed

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

100
10012
12345
12387
123
123456344
Run Code Online (Sandbox Code Playgroud)

我想搜索10012345在上面的文件中删除该模式匹配的行.

我也希望在一个命令中执行此操作.

Jan*_*ary 7

我会这么做的

egrep -v '^(100|12345)$' file.in > file.out
Run Code Online (Sandbox Code Playgroud)

或者,用sed

sed -n '/^\(100\|12345\)$/!p' file.in > file.out
Run Code Online (Sandbox Code Playgroud)

你甚至不需要第二个文件:

sed -ni '/^\(100\|12345\)$/!p' file.in
Run Code Online (Sandbox Code Playgroud)

(请参阅注释;严格来说,会创建一个临时文件,然后替换输入文件,但这对用户来说是透明的)

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

sed -n '/\<\(100\|12345\)\>/!p' file.in > file.out
Run Code Online (Sandbox Code Playgroud)

这将匹配线100,123 100 123但不匹配123 100123.

要获得相同的行为grep,请使用该-w选项(感谢Janito):

egrep -wv '(100|12345)' file.in > file.out
Run Code Online (Sandbox Code Playgroud)