【问题标题】:grep text only after ":" [duplicate]仅在“:”之后的 grep 文本 [重复]
【发布时间】:2018-10-31 18:39:24
【问题描述】:

我有一个 .txt 文件,其中包含不同的词,例如 blablabla:thatswhationlywant。

blablabla 的词总是不同的。所以我只需要打印“:”之后的所有字符 - 我该怎么做?

非常感谢!

【问题讨论】:

标签: linux bash grep


【解决方案1】:

你可以像这样使用 grep:

grep -o ':.*' file.txt

但这将包括:

我可能会用 cut 来做,因为它会更高效

cut -d: -f2 file.txt

【讨论】:

    【解决方案2】:

    使用cut 工具过滤grep 的输出。 grep ":" file.txt | cut -d ":" -f 2 只会显示字符 ':' 之后的文本 查看cut 的手册页了解更多信息

    【讨论】:

      【解决方案3】:

      另一种可能性。它并不比提供的 grep 解决方案好或差,但如果您是那些更熟悉 sed 的 s/// 操作的简单应用程序的人之一,那么 grep 的 -o\K 它可能会吸引人。

      $: sed 's/^.*://' in.txt
      thatswhationlywant.
      

      如果您对sed 不太熟悉(请查看here 了解更多详细信息)-

      • s/a/b/ 表示找到模式a 并将其替换为b
      • ^ 将搜索模式锚定在一行的开头
      • . 匹配任何字符(同样,请参阅详细信息以了解精确的异常情况)
      • * 表示“0 个或多个前面的模式”,在本例中是点 (.),因此可以是任意数量的任意字符
      • : 是文字冒号

      所以's/^.*://' 的意思是“替换从行首开始的任何/所有字符,包括一个冒号,没有任何内容。”

      请注意,冒号是一个字符,因此如果一行中有多个冒号,它们都会被消耗掉,因为* 是“贪婪”的。

      $: echo "a:b:c:d"|sed 's/^.*://'
      d
      

      如果这不是您想要的,请在 [^:] 中插入(这意味着“ 不是冒号”,因为在方括号“字符类”中,^ 是“ not') 对于.,像这样:

      $: echo "a:b:c:d"|sed 's/^[^:]*://'
      b:c:d
      

      【讨论】:

      • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
      • 你在说什么链接?
      • 显然这个答案正在接受“低质量答案”的审查。这是合理的,因为它非常小,但它是完成 OP 所要求的简单而直接的替代方法 - 并且从未使用或包含任何链接。有两个人建议删除它,可能是因为您应该始终包含链接中的相关参考资料……但这里没有链接。 XD
      • 纯代码答案也属于这一类。请在您的回答中提供更多背景信息或解释为什么这是正确的解决方案
      猜你喜欢
      • 1970-01-01
      • 2012-09-22
      • 2019-07-08
      • 2012-04-06
      • 2012-02-03
      • 1970-01-01
      • 2015-02-26
      • 2013-10-01
      • 1970-01-01
      相关资源
      最近更新 更多