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

时间:2012-10-15 11:33:30

标签: unix sed awk grep

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

100
10012
12345
12387
123
123456344

我想在上面的文件中搜索10012345,如果模式匹配,则删除该行。

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

4 个答案:

答案 0 :(得分:7)

我只想做

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

这会匹配行100123 100 123但不匹配123 100123

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

egrep -wv '(100|12345)' file.in > file.out

答案 1 :(得分:2)

sed '/\(100\|12345\)/d' file.txt

答案 2 :(得分:1)

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

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

这说:打印所有非100或12345 的行。如果数字只需要在行的开头匹配,请使用

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

如果他们可以在任何地方匹配,请使用

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

答案 3 :(得分:1)

使用sed的一种方式:

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

结果:

10012
12387
123
123456344