sedで一連の文字間隔を指定するには?

sedで一連の文字間隔を指定するには?

私は正規表現に初めて触れ、いくつかの欲求不満を感じました。ディレクトリを表す文字列を使用しようとしていますが、次を実行して問題を再現できます。

echo "a" | sed "s/a/home/books/examples/file/g"

次のように、sedコマンドの代替部分を\ Qと\ Eでラップしてエスケープしようとしました。

echo "a" | sed "s/a/\Qhome/books/examples/file\E/g"

また、拡張正規表現を有効にするために両方のコマンドに-rフラグを渡そうとしましたが、それは問題ではないと思います。

編集:問題は、sedがパスの一部の文字を特殊な正規表現文字として解釈するため、エスケープしたいが1つずつエスケープできないことです。上記のシーケンスをエスケープする方法は機能しません。

個々の文字をエスケープすることが可能であることはわかっていますが、これらの文字列の多くは変数を介してアクセスされ、これらの置換自体を実行するために別の同様のsedコマンドが必要なため、うまくいきません!

このコマンドをシェルスクリプトで実行する予定です。

ベストアンサー1

sedでは、各文字にバックスラッシュを手動で追加するか、別の区切り文字に切り替える必要があります。文字列が動的でユーザーから提供されている場合、どの文字が安全であるかは決してわかりません。次のようなことができます

s=${s//'\'/'\\'}
s=${s//'/'/'\/'}
sed "s/$s/replacement/g"

bashでは、Perlに切り替える方が簡単です。 Perlでは、次の\Q...\E構文を使用して部分文字列を引用できます。

perl -pe 's/\Q$ARGV[1]\E/replacement/g' "$s"

おすすめ記事