【问题标题】:Replace only the first occurence matching a regex with sed仅用 sed 替换与正则表达式匹配的第一个匹配项
【发布时间】:2011-06-17 11:34:49
【问题描述】:

我有一个字符串

test:growTest:ret

而使用 sed 我只想删除 test: 来获取:

growTest:ret

我试过了

sed '0,/RE/s/^.*://'

但它只给了我

ret

有什么想法吗?

谢谢

【问题讨论】:

    标签: regex sed


    【解决方案1】:

    将您的正则表达式 ^.*: 修改为 ^[^:]*:

    您所需要的只是.* 构造不会占用您的分隔符——冒号。为此,请将matching-any-char . 替换为负括号:[^abc],它匹配任何指定的字符

    另外,不要混淆^ 这两个抑扬符,因为它们有不同的含义:第一个匹配字符串的开头,第二个表示否定括号。

    【讨论】:

      【解决方案2】:

      如果我理解您的问题,您希望像 test:growTest:ret 这样的字符串变成 growTest:ret

      你可以使用:

      sed -i 's/test:(.*$)/\1/'
      

      i 表示就地编辑。

      s/one/two/ 将出现的 one 替换为 two

      所以这用“\1”替换了“test:(.*$)”。其中 \1 是第一组的内容,这是正则表达式在大括号内匹配的内容。

      "test:(.*$)" 匹配第一次出现的 "test:",然后将其他所有内容放在大括号中,直到行尾。大括号的内容在 sed 命令之后保留。

      【讨论】:

      • 这是否需要特定版本的 sed。当我尝试那个时,我得到sed: -e expression #1, char 16: invalid reference \1 on s'命令的 RHS`。
      • 答案中似乎存在错误。不是sed -i 's/test:\(.*$\)/\1/'吗?即选择器(和)总是需要一个 \ 反斜杠前缀。
      【解决方案3】:
      1. Sed 使用饥饿匹配。所以^.*: 将匹配test:growTest: 而不是test:
      2. 默认,sed 只替换第一个匹配的模式。所以你不需要做任何特别的事情。

      【讨论】:

        猜你喜欢
        • 2019-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-10
        • 2019-10-06
        • 2013-12-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多