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