【问题标题】:regex in sedsed 中的正则表达式
【发布时间】:2010-09-19 02:04:33
【问题描述】:

我需要使用 sed 将所有出现的 ##XXX## 转换为 ${XXX}。 X 可以是任何字母字符或“_”。我知道我需要使用类似的东西:

's/##/\${/g'

但这当然不会正确,因为它会将 ##FOO## 转换为 ${FOO${

有接受者吗? - 唐

【问题讨论】:

    标签: regex sed


    【解决方案1】:

    这里有一个更好的替换正则表达式:

    's/##\([a-zA-Z_]\+\)##/${\1}/g'
    

    或者如果你假设恰好三个字符:

    's/##\([a-zA-Z_]\{3\}\)##/${\1}/g'
    

    【讨论】:

      【解决方案2】:
      • 将 alpha 和 '_' 封装在 '\(' 和 '\)' 中,然后在右侧使用 '\1' 引用它。
      • '+' 匹配一个或多个 alpha 和 '_'(如果您看到 ####)。
      • 在末尾添加“g”选项以替换所有匹配项(我猜这就是您在这种情况下想要执行的操作)。
      的/##\([a-zA-Z_]\+\)##/${\1}/g'

      【讨论】:

      • + 不是 sed 中的标准运算符 -- 可能在 GNU sed 中。
      • 没有提到数字。
      • 是的,+ 是 GNU sed 中的一个运算符,可能不是。
      【解决方案3】:

      使用这个:

      s/##\([^#]*\)##/${\1}/
      

      顺便说一句,“s”运算符右侧的 $ 不需要转义。

      【讨论】:

      • [^#] 不是“任何字母字符或'_'”字符串的准确匹配。
      【解决方案4】:
      sed 's/##\([a-zA-Z_][a-zA-Z_][a-zA-Z_]\)##/${\1}/'
      

      \(...\) 记住...并在扩展中被称为\1。使用单引号来保持理智。

      正如下面的 cmets 所述,这也可以收缩为:

      sed 's/##\([a-zA-Z_]\{3\}\)##/${\1}/'
      

      此答案假定该示例需要精确匹配三个字符。根据哈希标记之间的内容,有多种变化。关键部分是记住匹配字符串的一部分。

      【讨论】:

      • 您假设井号之间正好有三个字符。即便如此,您也可以通过将 [a-zA-Z_][a-zA-Z_][a-zA-Z_] 转换为 [a-zA-Z_]{3} 来折叠它。
      • 这个问题只要求 3 'X';我同意这之间的字符是否可以在数量上是可变的会更清楚。
      【解决方案5】:
      echo "##foo##" | sed 's/##/${/;s//}/'
      
      • s 默认只修改 1 次
      • s//take 最后使用的搜索模式,所以 second s 也采取 ## 并且只有第二个出现仍然存在

      【讨论】:

        【解决方案6】:

        回显'##XXX##' | sed "s/^##([^#]*)/##${\1}/g"

        【讨论】:

        • 回显'##XXX##' | sed "s/^##([^#]*)/##$\{\1\}/g"
        【解决方案7】:

        sed 's/([^a-z][^A-Z][^0-9]*)/(&)/pg

        【讨论】:

        • 这是错误的。它没有给出他所期望的有效答案。仔细阅读问题。
        猜你喜欢
        • 1970-01-01
        • 2018-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-28
        • 1970-01-01
        • 1970-01-01
        • 2019-08-04
        相关资源
        最近更新 更多