我試圖用特殊字符的字符串替換shell腳本中的字符串:一個字符串替換shell腳本中的字符串特殊字符
name="test&commit"
echo "{{name}}" | sed "s/{{name}}/$name/g"
和我得到的結果是
test{{name}}commit
我知道在&之前加\會使其工作,但名稱參數是由用戶給出的,所以我希望我的代碼能夠預測這一點。有誰知道如何做到這一點?
我試圖用特殊字符的字符串替換shell腳本中的字符串:一個字符串替換shell腳本中的字符串特殊字符
name="test&commit"
echo "{{name}}" | sed "s/{{name}}/$name/g"
和我得到的結果是
test{{name}}commit
我知道在&之前加\會使其工作,但名稱參數是由用戶給出的,所以我希望我的代碼能夠預測這一點。有誰知道如何做到這一點?
您需要使用另一個sed命令在給定輸入字符串中的所有特殊字符之前添加反斜槓。
$ name="test&commit"
$ name1=$(sed 's/[^[:alpha:][:digit:][:blank:]]/\\&/g' <<<"$name")
$ echo $name1
test\&commit
$ echo "{{name}}" | sed "s/{{name}}/$name1/g"
test&commit
將它最小化,
$ name="test&commit"
$ echo "{{name}}" | sed "s/{{name}}/$(sed 's/[^[:alpha:][:digit:][:blank:]]/\\&/g' <<<"$name")/g"
test&commit
在Perl中,你可以關閉以\ Q \ P表達式。
我填的是瓦爾模板,佔位符和名稱:
$ echo "template=$template"
template=The name is {{name}} and we like that.
$ echo "placeholder=$placeholder"
placeholder={{name}}
$ echo "name=$name"
name=test&commit
更換將
$ echo $template | perl -pe 's/\Q'$placeholder'\E/'$name'/g'
The name is test&commit and we like that.
稍微進行修改提供了模板和值的方法:
$ cat template
Dear {{name}}
I hope to see you {{day}}.
(模板是具有{{var}}
的文件,用值來實例化)
$ name='Mary&Susan' day=tomorrow perl -pe 's/{{(\w+)}}/$ENV{$1}/g' template
Dear Mary&Susan,
I hope to see you tomorrow.
這個'name1 = $(sed's/[[:punct:]]/\\&g'<<<「$ name」)'也適合嗎?如果允許的話,我們可以添加'[:cntrl:]'也可以用於特殊字符。 – NeronLeVelu
'cntrl'類是添加到'punct',而不是替換:-) – NeronLeVelu
所有你真正需要的是'sed's/[&/ \]/\\&g''。請參閱http://stackoverflow.com/a/29626460/1745001。 –