本文首發于我的Github部落格
本文記錄了作者在使用
sed
指令進行文本替換時,對于使用到的替換模式進行轉義處理使用到的
sed
指令,簡單來說:
- 使用
即可對輸入字元串進行轉義sed -e 's/[]\/$*.^[]/\\&/g'
場景
sed
指令常常被用來對文本做處理,其中一個最經常用到的處理就是替換,替換的文法如下:
當然也可以有其他的變化,不過這是作者使用的最多的方式。
在使用這些的時候,我們可能會在
match_pattern
和
replace_pattern
中引用變量,已達到分别管理和增強可讀性的目的,比如
# dummy text
TEXT="affaflns,fakfnakn"
REPLACE="ff"
REPLACED_TEXT=$(echo $TEXT | sed -e "s/a/$REPLACE/g")
但是,如果上面引用的
REPLACE
裡面有特殊字元,我們就會遇到問題,比如
# dummy text
TEXT="affaflns,fakfnakn"
REPLACE="/a"
# 有問題
REPLACED_TEXT=$(echo $TEXT | sed -e "s/a/$REPLACE/g")
我們的本意是将
a
替換為
/a
,但是,使用這幾條指令,會得到
sed: 1: "s/a//a/g
": bad flag in substitute command: 'a'
這裡的原因就是
/a
中的
/
是一個特殊字元,如果希望得到我們上述的效果,應該這麼操作
# dummy text
TEXT="affaflns,fakfnakn"
REPLACE="\/a"
# 成功
REPLACED_TEXT=$(echo $TEXT | sed -e "s/a/$REPLACE/g")
我們通過
\/
進行轉義,取得了成功,但是這種方式使得我們編寫
replace_pattern
變得麻煩,而且很不直覺,我們希望有一個函數來達到如下效果
# dummy text
TEXT="affaflns,fakfnakn"
REPLACE="/a"
REPLACE=$(func $REPLACE)
REPLACED_TEXT=$(echo $TEXT | sed -e "s/a/$REPLACE/g")
也就是說,編寫
replace_pattern
時,可以直接編寫,而後使用一個函數或者指令自動轉義再使用
解決方案
stackoverflow
使用
sed -e 's/[]\/$*.^[]/\\&/g'
即可
方案解析
我們這次的方案就是對原生的
replace_pattern
做一次替換:
-
為match_pattern
[]\/$*.^[]
- 這個正規表達式的結構很具有迷惑性,其實它是一個大的bracket group
- 也就是說,實際上是
[
]\/$*.^[
的結構]
- 意味着比對
中的任一字元]\/$*.^[
-
為replace_pattern
\\&
- 這個
用到了一個轉義字元和一個特殊字元replace_pattern
- 轉義字元
表示的就是\\
\
- 特殊字元
表示的是&
比對到的内容match_pattern
- 這個
綜合起來,這個替換語句就是把
]\/$*.^[
前面全部加上一個斜杠,進行轉義