【问题标题】:colorize string using grep -P使用 grep -P 为字符串着色
【发布时间】:2017-07-28 21:39:46
【问题描述】:

我正在使用grep-P(Perl 正则表达式)为字符串着色:

echo aaa bbb ccc ddd eee | grep --color=always -P "^[^#]*\K(bbb|ccc)|^"

在上面的例子中,我想给字符串bbbccc着色。但是,grep 只会对最后一个 (ccc) 着色。

如何修改我的正则表达式,使两个字符串匹配并着色?

【问题讨论】:

  • 试试bbb|ccc#和BOS主播^有什么关系?
  • @sln - 我不想给 cmets 着色,因此是 #。 “试试 bbb|ccc”是什么意思?
  • 我想grep 只着色它实际匹配的内容,而不是你过去匹配的正则表达式。 (这里是ccc,因为*是贪婪的。)
  • 除非 grep 不是行解析器,否则它不会为您提供最后一个从右到左的匹配项?
  • @sin 有趣的是,在末尾添加g 使其颜色为bbb。我会说这是因为如果 first 匹配 ccc* 是贪婪的)然后它继续匹配 bbb

标签: regex colors grep


【解决方案1】:

因为您的正则表达式仅匹配一种替代方法:From ^ start until ccc。但是你想要多个匹配。这可以通过链接匹配以开始使用\G anchor 来实现。

还需要通过附加? 来制作[^#]* lazy,以免跳过比赛。

echo aaa bbb ccc ddd eee | grep --color=always -P "\G[^#]*?\K(?:bbb|ccc)"

还有多行字符串的正则表达式变体。

(?:\G|\n)[^#]*?\K(?:bbb|ccc)

See this demo at regex101


另一种方法是使用pcre verbs (*SKIP)(*F) 跳过任何内容,直到从# 结束为止

#.*(*SKIP)(*F)|bbb|ccc

See another demo at regex101

【讨论】:

    【解决方案2】:

    另一种选择是使用 perl 命令为您进行匹配。

    echo "aaa bbb ccc ddd eee fff" | perl -ne'print if s/(bbb|eee)/\e[1;35m$1\e[0m/g'
    

    【讨论】:

      猜你喜欢
      • 2014-11-27
      • 1970-01-01
      • 1970-01-01
      • 2011-06-21
      • 2021-10-24
      • 1970-01-01
      • 2020-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多