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