値を検索および置換するための一般的なsedコマンド

値を検索および置換するための一般的なsedコマンド

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

おすすめ記事