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