たとえば、プレースホルダー{{VALUE}}
を任意の文字を含むことができる別の文字列に置き換えたい場合、それを行うための最良の方法は何ですか?
スラッシュが含まれていると、使用にsed s/{{VALUE}}/$(value)/g
失敗する可能性があります。$(value)
oldValue='{{VALUE}}'
newValue='new/value'
echo "${var//$oldValue/$newValue}"
ただし、oldValueは正規表現ではありませんがグロブパターンのように機能します。それ以外の場合は:
echo "$var" | sed 's/{{VALUE}}/'"${newValue//\//\/}"'/g'
Sedも's|something|someotherthing|g'
(または他の区切り文字を使用して)同様に機能しますが、入力文字列を制御できない場合は、sedに渡す前に何らかの関数を使用してエスケープする必要があります。
尋ねられた質問は基本的に重複 していますbashのユーザー入力変数のスラッシュをエスケープするにはどうすればよいですか?、 sed検索パターンの文字列をエスケープします。makefileでsedを 使用します。変数をエスケープする方法は?、 sed replaceでスラッシュを使用する、および他の多くの質問。「別の区切り文字を使用する」が通常の答えです。ピアノサウルスの答えとベンブランクの答え代替区切り文字として使用されている文字に加えて、シェルでエスケープする必要のある文字(円記号とアンパサンド)をリストします。ただし、「任意の文字を含むことができる文字列」に二重引用符が含まれている場合に発生する引用符による引用の問題には対応していません。同じ種類の問題が${parameter/pattern/string}
、前の回答で述べたシェル変数の拡張に影響を与える可能性があります。
上記のいくつか以外のいくつかの質問は、awkの使用を示唆しています。これは通常、sedで簡単に実行できるよりも複雑な変更に対する優れたアプローチです。perlとpythonも検討してください。一重引用符と二重引用符の文字列に加えて、Pythonには、u'...'
ユニコード引用符、r'...'
生引用符、引用符、および区切り文字ur'...'
付きのトリプル引用符があります。述べられている質問は、特定のawk / perl/pythonソリューションに十分なコンテキストを提供していません。'''
"""