【发布时间】:2010-09-19 02:04:33
【问题描述】:
我需要使用 sed 将所有出现的 ##XXX## 转换为 ${XXX}。 X 可以是任何字母字符或“_”。我知道我需要使用类似的东西:
's/##/\${/g'
但这当然不会正确,因为它会将 ##FOO## 转换为 ${FOO${
有接受者吗? - 唐
【问题讨论】:
我需要使用 sed 将所有出现的 ##XXX## 转换为 ${XXX}。 X 可以是任何字母字符或“_”。我知道我需要使用类似的东西:
's/##/\${/g'
但这当然不会正确,因为它会将 ##FOO## 转换为 ${FOO${
有接受者吗? - 唐
【问题讨论】:
这里有一个更好的替换正则表达式:
's/##\([a-zA-Z_]\+\)##/${\1}/g'
或者如果你假设恰好三个字符:
's/##\([a-zA-Z_]\{3\}\)##/${\1}/g'
【讨论】:
的/##\([a-zA-Z_]\+\)##/${\1}/g'
【讨论】:
使用这个:
s/##\([^#]*\)##/${\1}/
顺便说一句,“s”运算符右侧的 $ 不需要转义。
【讨论】:
sed 's/##\([a-zA-Z_][a-zA-Z_][a-zA-Z_]\)##/${\1}/'
\(...\) 记住...并在扩展中被称为\1。使用单引号来保持理智。
正如下面的 cmets 所述,这也可以收缩为:
sed 's/##\([a-zA-Z_]\{3\}\)##/${\1}/'
此答案假定该示例需要精确匹配三个字符。根据哈希标记之间的内容,有多种变化。关键部分是记住匹配字符串的一部分。
【讨论】:
echo "##foo##" | sed 's/##/${/;s//}/'
s 默认只修改 1 次s//take 最后使用的搜索模式,所以 second s 也采取 ## 并且只有第二个出现仍然存在【讨论】:
回显'##XXX##' | sed "s/^##([^#]*)/##${\1}/g"
【讨论】:
sed 's/([^a-z][^A-Z][^0-9]*)/(&)/pg
【讨论】: