私はシェルスクリプトを使用してさまざまな種類の仮想マシンを設定します。これらのスクリプトには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
ロードしようとすると、誰かがそのディレクトリにマルウェアを植えた可能性があります。システムに付属の拡張プログラムのパスは異なる場合があります。出力を参照してください。inplace
inplace
inplace.awk
inplace
gawk
gawk 'BEGIN{print ENVIRON["AWKPATH"]}'
またはperl
(-i
どこから来たのか):
(export VAR
perl -pi -e '$_ .= "$ENV{VAR}\n" if /MatchingPattern/' somefile)
答え2
このエラーは、実際の背後にバックスラッシュが必要なsed
追加のコマンドによって発生します。a
a
GNUの使用sed
:
$ sed "/pattern/a\\$VAR" file.in >file.out
私が知っている限り、BSDは改行文字が正しくエスケープされていない限り、ファイルに行を挿入するsed
ためにこのコマンドのみを使用できます。a
BSDを使用してこの問題を解決する方法に対する密接に関連した答えは次のとおりですsed
。http://unix.stackexchange.com/a/60322