変数から特殊文字をエスケープします。 [重複]

変数から特殊文字をエスケープします。 [重複]

私は持っています

#!/usr/bin/bash
search="ldo_vrf18 {"
replace="$search"'                      compatible = "regulator-fixed";
                        regulator-name = "vrf18";
                        regulator-min-microvolt = <1800000>;
                        regulator-max-microvolt = <1800000>;
                        regulator-enable-ramp-delay = <120>;'
sed -i "s/$search/$replace/g" output.file

明らかにする

sed: -e expression #1, char 62: unterminated `s' command

いくつかの値がないようですreplace。これを避ける方法はありますか?試してみましたが、sed -i 's/'"$search"'/'"$replace"'/g' output.file同じ結果です。

答え1

問題は、コマンドの終わり$replaceとして解釈される変数の改行文字にあります。sed

GNUでこの問題を解決するには、変数の新しい行をtextに置き換える必要がありsedます。$replace\n

replace=${replace//$'\n'/\\n}

メモ:sed上記のソリューションは一部のバージョン(GNUなど)の拡張機能なので、すべての実装では機能しませんsed。 ~によるとPOSIX規格:

各組み込み<改行>テキストの前にはバックスラッシュが必要です。テキストの他のバックスラッシュは削除し、+以降の文字は文字通り処理する必要があります。

したがって、POSIXでは、sedリテラルは\n改行の意味を失い、リテラルn文字として扱われます。すべての実装で動作する移植可能なソリューションの場合は、実際のsed改行の前にバックスラッシュを追加してください。

replace=${replace//$'\n'/\\$'\n'}

+バックスラッシュの後に数字が続く場合を除く:

文字"\n"n数字はどこにありますか?、対応する逆参照式に一致するテキストで置き換える必要があります。 [...] のための お互いのバックスラッシュ( ' \')が表示されると、次の文字は特別な意味を失います。(もしそうなら)。

関連情報