sed中转义字符的替换
背景
在使用sed的时候,经常我们会用来替换字符串,如果被替换的字符串中包含转移字符串怎么办?
比如:如果用下面的这种方式,就会替换失败
source="testabc"
replace="testsdfa/dfe"
# 替换失败
result=$(echo $source | sed -e "s/a/$replace/g")
具体的报错信息:
sed: 1: "s/a/testsdfa/dfe/g
": bad flag in substitute command: 'd'
解决方法
第一种对/进行转义
source="testabc"
replace="testsdfa\/dfe"
# 替换失败
result=$(echo $source | sed -e "s/a/$replace/g")
但是这样的话,如果出现其他的转义字符还是得手动更改
第二种方式使用通配得方式,就行转义替换,参考地址: Escape a string for a sed replace pattern - Stack Overflow
# 通过以下通配的方式
sed -e 's/[]\/$*.^[]/\\&/g'
如何解读:
-
match_pattern
为[]\/$*.^[]
- 其实它是一个bracket group,实际上是
[
]\/$*.^[
]
的结构 - 匹配
]\/$*.^[
中的任一字符
- 其实它是一个bracket group,实际上是
-
replace_pattern
为\\&
- 这个
replace_pattern
用到了一个转义字符和一个特殊字符 - 转义字符
\\
表示的就是\
- 特殊字符
&
表示的是match_pattern
匹配到的内容
- 这个
替换语句就是把]\/$*.^[
前面全部加上一个斜杠,进行转义
网友评论