我需要使用 sed 将所有出现的 ##XXX## 转换为 ${XXX}。X 可以是任何字母字符或“_”。我知道我需要使用类似的东西:
's/##/\${/g'
但当然这不会正确,因为它会将 ##FOO## 转换为 ${FOO${
有接盘侠吗?- 大学教师
这是一个更好的替换正则表达式的镜头:
's/##\([a-zA-Z_]\+\)##/${\1}/g'
或者,如果您假设恰好三个字符:
's/##\([a-zA-Z_]\{3\}\)##/${\1}/g'
's/##\([a-zA-Z_]\+\)##/${\1}/g'
用这个:
s/##\([^#]*\)##/${\1}/
顺便说一句,没有必要在“s”运算符的右侧转义 $。
sed 's/##\([a-zA-Z_][a-zA-Z_][a-zA-Z_]\)##/${\1}/'
\(...\)
记忆...并在扩展中被引用\1
。使用单引号来保存你的理智。
正如下面的评论中所指出的,这也可以收缩为:
sed 's/##\([a-zA-Z_]\{3\}\)##/${\1}/'
此答案假定该示例需要恰好匹配三个字符。根据哈希标记之间的内容,有多种变化。关键部分是记住匹配字符串的一部分。
echo "##foo##" | sed 's/##/${/;s//}/'
s
默认只更改 1 次s//
采用上次使用的搜索模式,因此 second 也采用##
并且仅第二次出现仍然存在回声'##XXX##' | sed "s/^##([^#]*)/##${\1}/g"
sed 's/([^az] [^AZ] [^0-9]*)/(&)/pg