sedを使用して文字列を別の文字列に置き換える方法はありますか? sedは検索と置換式に区切り文字を使用するため、他の文字列をすべてのパスのすべての文字(またはすべての文字)に置き換えることができるsedコマンドを書く方法が見つかりません(ここにはすべての文字を含めることができます) 。
以下はうまくいかないものの例です。
new_value="foobar"
old_value="baz"
echo "$some_path" | sed -e "s|$old_value|$new_value|"
このコマンドは、パイプがないかパイプが含まれていない限り$new_value
有効です$old_value
。この場合、代替構文はsed式で使用されている変数によって破損するため、コマンドは何の効果もありません。
sedを使用して文字列を別の文字列に置き換える方法はありますか?
そうでなければ、Unixの良い選択肢はありますか?
答え1
この問題を解決する簡単な方法は、次を呼び出す前に変数のすべてをエスケープすることですsed
。
new_value="foo|bar"
old_value="ba|z"
new_value=$(printf '%q' "$new_value")
old_value=$(printf '%q' "$old_value")
some_path="/path/to/ba|z/file"
それから:
$ echo "$some_path" | sed -e "s|$old_value|$new_value|"
/path/to/foo|bar/file
ここでのヒントはprintf '%q'
次のとおりですhelp printf
(bash組み込みヘルプを表示printf
)。
%q quote the argument in a way that can be reused as shell input
答え2
シェルパラメータ置換を使用して必要な文字をエスケープできます。
sed -e "s|${old_value//|/\\|}|${new_value//|/\\|}|"