sed中轉(zhuǎn)義字符的替換
背景
在使用sed的時(shí)候,經(jīng)常我們會用來替換字符串,如果被替換的字符串中包含轉(zhuǎn)移字符串怎么辦?
比如:如果用下面的這種方式,就會替換失敗
source="testabc"
replace="testsdfa/dfe"
# 替換失敗
result=$(echo $source | sed -e "s/a/$replace/g")
具體的報(bào)錯(cuò)信息:
sed: 1: "s/a/testsdfa/dfe/g
": bad flag in substitute command: 'd'
解決方法
第一種對/進(jìn)行轉(zhuǎn)義
source="testabc"
replace="testsdfa\/dfe"
# 替換失敗
result=$(echo $source | sed -e "s/a/$replace/g")
但是這樣的話,如果出現(xiàn)其他的轉(zhuǎn)義字符還是得手動(dòng)更改
第二種方式使用通配得方式,就行轉(zhuǎn)義替換,參考地址: Escape a string for a sed replace pattern - Stack Overflow
# 通過以下通配的方式
sed -e 's/[]\/$*.^[]/\\&/g'
如何解讀:
-
match_pattern為[]\/$*.^[]- 其實(shí)它是一個(gè)bracket group,實(shí)際上是
[]\/$*.^[]的結(jié)構(gòu) - 匹配
]\/$*.^[中的任一字符
- 其實(shí)它是一個(gè)bracket group,實(shí)際上是
-
replace_pattern為\\&- 這個(gè)
replace_pattern用到了一個(gè)轉(zhuǎn)義字符和一個(gè)特殊字符 - 轉(zhuǎn)義字符
\\表示的就是\ - 特殊字符
&表示的是match_pattern匹配到的內(nèi)容
- 這個(gè)
替換語句就是把]\/$*.^[前面全部加上一個(gè)斜杠,進(jìn)行轉(zhuǎn)義