在文件中查找完全匹配的多个模式,如果模式匹配则删除该行

3
例如,一个不包含重复条目的具有以下内容的文件:
100
10012
12345
12387
123
123456344

我希望在上述文件中搜索10012345,如果匹配到该模式,则删除该行。

此外,我希望用单个命令完成此操作。


为什么这个问题被踩了?在评论中解释一下会更好。 - January
4个回答

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

我还要补充一点,如果你想匹配 100 而不是 10012,你应该添加 -w 标志来指示 grep 匹配整个单词。 - Janito Vaqueiro Ferreira Filho
抱歉,它不起作用。这个命令也会删除10012和123456344。使用此命令后的输出是::::Desktop $ egrep -v '(^100|12345)' Untitled \ Document 12387 123 - Prince Garg
“你不需要第二个文件”是不正确的,因为sed -i使用临时文件。 - William Pursell
@WilliamPursell 严格来说,是的;然而从用户的角度来看,没有额外的文件被永久创建。 - January

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

1
如果数字必须完全匹配,您可以使用类似于以下的扩展grep模式:
 grep -v -E '^(100|12345)$' inputfile

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

如果它们能够在任何地方匹配,请使用

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

1

使用 sed 的一种方法:

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

结果:

10012
12387
123
123456344

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接