複数行変数を持つシェルスクリプトでsedを使用する

複数行変数を持つシェルスクリプトでsedを使用する

私はシェルスクリプトを使用してさまざまな種類の仮想マシンを設定します。これらのスクリプトにはsed

そうすれば、すべてが大丈夫です。

VAR="Config Line1\nConfig Line2\nConfig Line 3"
sed -i "/MatchingPattern/ a $VAR" somefile

しかし、特にテキストブロックがかなり長い可能性があるため、スクリプトを読みやすくすることはできません。

私がこう書いているなら:

VAR="Config Line1
Config Line2
Config Line 3"
sed -i "/MatchingPattern/ a $VAR" somefile

スクリプトの実行中にエラーが発生しました:sed: -e expression #1, char 31: unknown command:C ''

sedこのように宣言された変数を使用する方法はありますか?

ベストアンサー1

このコマンドの標準構文は次aのとおりです。

sed -e 'a\
first line\
  second line\
last line'

BSD(最小FreeBSDおよびOS / X)はsed先行スペースを削除します。-eバグを修正する必要があります。 GNUでは、最初の行が空でない限り、sed右後ろに最初の行を移動できます。a\

したがって、入力を前処理する必要があります。

VAR='content with
multiple lines
  some with lead blanks
or even backslash\'

preprocessed_VAR=$(printf '%s\n' "$VAR" |
  sed 's/\\/&&/g;s/^[[:blank:]]/\\&/;s/$/\\/')

sed -i -e "/MatchingPattern/a\\
${preprocessed_VAR%?}" somefile

FreeBSD または OS/X では (-iに置き換え) -i ''

GNU/Linux では、GNU シェル( bash) または を使用してzsh次のことができます。

sed -i '/MatchingPattern/r /dev/stdin' <<< "$VAR"

bashこれは、here-stringsが削除された一時ファイルを使用して実装され、Linuxの/ dev / stdinがファイルへのシンボリックリンクとして実装されているために機能しますzsh。つまり、複数回開くことができ、最初に開くたびに毎回開くことができます。

ここでは代わりにGNUを使用することもできますawk

(export VAR
gawk -i /usr/share/awk/inplace.awk '{print}; /MatchingPattern/{print ENVIRON["VAR"]}' somefile)

使用しないでください-i inplace現在の作業ディレクトリから最初に拡張機能をgawkロードしようとすると、誰かがそのディレクトリにマルウェアを植えた可能性があります。システムに付属の拡張プログラムのパスは異なる場合があります。出力を参照してください。inplaceinplaceinplace.awkinplacegawkgawk 'BEGIN{print ENVIRON["AWKPATH"]}'

またはperl-iどこから来たのか):

(export VAR
perl -pi -e '$_ .= "$ENV{VAR}\n" if /MatchingPattern/' somefile)

おすすめ記事