10

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

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

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

有接盘侠吗?- 大学教师

4

7 回答 7

12

这是一个更好的替换正则表达式的镜头:

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

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

's/##\([a-zA-Z_]\{3\}\)##/${\1}/g'
于 2008-10-24T18:45:16.990 回答
2
  • 将 alpha 和 '_' 封装在 '\(' 和 '\)' 中,然后在右侧使用 '\1' 引用它。
  • '+' 匹配一个或多个 alpha 和 '_'(如果你看到####)。
  • 将“g”选项添加到末尾以替换所有匹配项(我猜这就是您在这种情况下想要做的)。
's/##\([a-zA-Z_]\+\)##/${\1}/g'
于 2008-10-24T18:48:07.657 回答
1

用这个:

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

顺便说一句,没有必要在“s”运算符的右侧转义 $。

于 2008-10-24T18:41:36.453 回答
1
sed 's/##\([a-zA-Z_][a-zA-Z_][a-zA-Z_]\)##/${\1}/'

\(...\)记忆...并在扩展中被引用\1。使用单引号来保存你的理智。

正如下面的评论中所指出的,这也可以收缩为:

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

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

于 2008-10-24T18:44:13.077 回答
1
echo "##foo##" | sed 's/##/${/;s//}/'
  • s默认只更改 1 次
  • s//采用上次使用的搜索模式,因此 second 也采用##并且仅第二次出现仍然存在
于 2014-10-14T09:09:00.657 回答
0

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

于 2009-03-17T17:44:01.410 回答
0

sed 's/([^az] [^AZ] [^0-9]*)/(&)/pg

于 2012-09-27T08:59:29.793 回答