【问题标题】:Print everything on line after match [duplicate]比赛后在线打印所有内容[重复]
【发布时间】:2011-07-17 20:12:57
【问题描述】:

我有一个大文本文件,其中包含一个唯一的字符串。我想要做的是使用 grep 打印字符串之后的所有内容。

cat textfile | grep "target_string"
This highlights target_string but prints the whole file

cat textfile | grep -o "target_string"
This prints only target_string

cat textfile | grep -o "target_string*"
This prints only target_string

如何在 target_string 之后打印所有内容而之前什么都不打印?

【问题讨论】:

  • “一切”是指那条线上的一切,对吧?看起来很多人将您的问题解释为文件的其余部分。
  • 我在字符串 ON THAT LINE 之后添加了打印所有内容的答案,而不是文件的其余部分

标签: bash grep


【解决方案1】:

奇怪的是,接受的答案打印出了整行,我只想要目标字符串之后的所有信息。这对我有用:

sed -n 's/target_string//p' filename

改编自this post

【讨论】:

  • 这假定target_string 位于行首。您可以将正则表达式更改为 .*target_string 来解决这个问题。
【解决方案2】:

使用 GNU grep,试试 -B0 -A999999999 或类似的。更好的选择可能是awk

awk '/target_string/ {seen = 1}
     seen            {print}'

如果(你的问题说明有点不清楚)你也不需要打印匹配行,sed 更短:

sed '1,/target_string/d'

【讨论】:

  • sed 线完美地满足了我的需要,谢谢!
  • 您也可以使用-C 3 来获取线路周围的线路 - 我完全忘记了这些选项!
  • 这是非常有用的信息,正是 我正在寻找的,但我很确定 OP 只想匹配 该行的其余部分。乍一看并不是很明显,但如果你仔细阅读这个问题,我认为这可以看出。 (“在匹配后打印所有内容在线”而不是“打印所有内容在匹配行之后”)当然,这种澄清(或混淆?)也可能是由于在您回答后进行的编辑...
【解决方案3】:

你忘记了'.':

    cat textfile | grep -o "target_string.*"

【讨论】:

  • 不需要cat,直接grep文件即可。
  • awk 解决方案似乎更加灵活和有用。
  • 提示:如果您还需要删除文件名前缀,请与-h 结合使用。 (例如,如果做 find | grep
【解决方案4】:

这将在每次匹配后打印所有内容,仅在同一行:

perl -lne 'print $1 if /target_string(.*)/' textfile

这将做同样的事情,除了它还将打印所有后续行:

perl -lne 'if ($found){print} else{if (/target_string(.*)/){print $1; $found++}}' textfile

【讨论】:

  • 我想在一个模式之后打印一行的其余部分。第一个效果很好。其他答案都没有帮助。这是为了删除路径中特定目录之前的所有内容。
猜你喜欢
  • 2013-08-12
  • 1970-01-01
  • 2019-11-30
  • 2018-08-29
  • 1970-01-01
  • 2012-02-29
  • 1970-01-01
  • 2017-01-28
  • 1970-01-01
相关资源
最近更新 更多