【问题标题】:Keep only first line with matching pattern仅保留具有匹配模式的第一行
【发布时间】:2019-01-31 21:53:58
【问题描述】:

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

例如,来自

sheep
cow
pig
pig
goat

pig

pig 是该模式的第一行。

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

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

不过,不知道如何只保留第一次出现。

【问题讨论】:

  • grep pattern file | head 1?
  • 甚至更好grep -m1 pattern file | sponge file
  • @daniu 你有错字。我很确定您的意思是head -1(或等效的head -n 1),因为head 1 将尝试打开一个名为1 的文件。

标签: bash sed cat


【解决方案1】:

你可以在第一场比赛后告诉 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

【讨论】:

  • 既然你已经知道该文件的内容应该是什么了,那么如果grep成功就可以自己写了:grep -q pig infile && echo pig > infile
  • @chepner 是的,但对于任何不那么琐碎的事情,例如模式与完整行不匹配的情况,都会中断。
猜你喜欢
  • 1970-01-01
  • 2020-05-29
  • 2020-02-09
  • 2016-01-28
  • 1970-01-01
  • 2015-05-07
  • 2017-02-02
  • 2020-11-26
  • 2012-09-05
相关资源
最近更新 更多