3

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

100
10012
12345
12387
123
123456344

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

我也想在一个命令中做到这一点。

4

4 回答 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
于 2012-10-15T11:35:11.920 回答
2
sed '/\(100\|12345\)/d' file.txt
于 2014-04-23T14:54:36.213 回答
1

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

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

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

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

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

 grep -v -E '(100|12345)' inputfile
于 2012-10-15T11:41:30.450 回答
1

一种使用方式sed

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

结果:

10012
12387
123
123456344
于 2012-10-15T12:00:58.673 回答