只保留匹配模式的第一行

Keep only first line with matching pattern

有谁知道我如何在文件中搜索字符串,然后删除除了第一次出现该模式的行之外的所有行?

例如,来自

sheep
cow
pig
pig
goat

pig

其中 pig 是具有该模式的第一行。

我知道如何删除不包含模式的行:

sed -i -e '/PATTERN/!d' file

但是不知道如何只保留第一个出现的地方。

您可以在第一次匹配后告诉 sed quit

sed -i '/pig/!d;q' infile

这是有效的,因为当 d 被命中时,其余的命令将被忽略,所以 q 只会在第一次匹配后执行。

或者您可以使用 grep 的 -m 选项(适用于 GNU 和 BSD grep,但 POSIX 不需要):

grep -m1 'pig' infile > infile.tmp && mv infile.tmp infile