【问题标题】:Sed - Replace a pattern with a single characterSed - 用单个字符替换模式
【发布时间】:2015-12-19 13:14:30
【问题描述】:

我有以下文字

我真的很酷。我给自己打了 10 分(满分 10 分)。

使用sed我想把文字改成

我 * * *。我 * * 10 * * 10。

即(将 [a-z] 替换为 * ) 我尝试使用模式s/[a-z]/*/g

但它把文本替换为

我 ** ****** ****。我 **** ****** 10 *** ** 10.

【问题讨论】:

    标签: regex sed pattern-matching


    【解决方案1】:

    您的模式用星号替换每个小写字母。您想用星号替换尽可能多的连续小写字母。使用+ for repetition:

    s/[a-z]\+/*/g
    

    【讨论】:

    • 没用。文本是相同的 - 根本没有改变。 - 在 Windows 上使用 cygwin。
    • 与 s/[a-z]\+/*/g 一起使用。但是有什么区别呢?
    • @anupamD,与[a-z] 的区别在于您不会替换单个字符,而是替换所有与[a-z] 匹配的连续字符。
    • 是的,实际上我说的是使用 \+ 而不是 +;尽管您已经对其进行了编辑。顺便谢谢。 :)
    • @anupamD, + 将匹配字符 +\+ 会有重复的意思。对此感到抱歉。
    【解决方案2】:

    @ndn 给出的答案是正确的想法,但 SED 默认使用 Posix 2 基本正则表达式,因此您没有完整正则表达式的所有选项。特别是 + 运算符(重复一次或多次)在 SED 中无效。幸运的是*(重复零个或多个)是。因此我们可以这样做:

    sed s/[a-z][a-z]*/*/g
    

    应该做你想做的事。您还可以使用 sed 命令行选项启用完整的正则表达式(对我来说是-r

    sed -r s/[a-z]+/*/g
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-15
      • 2017-12-17
      • 2021-09-23
      • 1970-01-01
      相关资源
      最近更新 更多