テキストファイルの「start」という単語の後に変数を追加したいと思います。
echo $variable
与えられた
rn=45
fg=12
cd=6
私のテキストファイルは次のとおりです
mixture
Molefraction
begin
END_OF_FILE
私が望む出力
mixture
Molefraction
begin
rn=45
fg=12
cd=6
END_OF_FILE
sed
このコマンドを使用しています
sed -i "/begin/a $variable" file.txt
これは次のエラーメッセージを提供します
sed: -e expression #1, char 56: extra characters after command
答え1
sed
「ここの文字列」を理解するシェルを使用してください。
$ sed '/begin/r/dev/stdin' file <<<"$variable"
mixture
Molefraction
begin
rn=45
fg=12
cd=6
END_OF_FILE
これは文字列を見つけて一致すると、標準入力のすべての内容が挿入されますbegin
。ここでは、文字列を介して標準入力値を渡しますfile
。$variable
他のシェルでは、ここにある文字列をprintf
パイプに置き換えることができます。
$ printf '%s\n' "$variable" | sed '/begin/r/dev/stdin' file
mixture
Molefraction
begin
rn=45
fg=12
cd=6
END_OF_FILE
新しいファイルに保存するには、最後にリダイレクトを使用してください。sed
これを使用して内部編集をサポートしている場合は、sed -i
それを使用して元のファイルを変更できます(ファイルのコピーでテストすることをお勧めします。複数回実行すると、複数のデータがファイルに追加されます)。
正しいインデントを得るには、次の手順を実行しますbash
。
$ ( set -f; IFS=$'\n'; printf ' %s\n' $variable ) | sed '/begin/r/dev/stdin' file
mixture
Molefraction
begin
rn=45
fg=12
cd=6
END_OF_FILE
ここでは、シェルのトークン化を使用して変数値を書式設定します。私たちはset -f
それを使用してファイル名のグロービングを避け、改行$IFS
文字を設定し、シェルに変数の値を改行で区切られた単語に分割します。少し修正しprintf
、各単語の前にスペースを2つ挿入します。
答え2
使用awk
:
awk -v f="$variable" '/begin/{print; print f; next}1' input
その後、その内容を含む行を見つけてbegin
印刷し、変数の内容を印刷して次の行に移動します。デフォルトは別の行を印刷することです。
注:例に示すように、変数をインデントしません。
GNU awkでは、次のオプションを使用してファイルを編集できます-i
。
awk -iv f="$variable" '/begin/{print; print f; next}1' input
他のすべてのバージョンでは、awk
新しいファイルを作成する必要があります。
awk -v f="$variable" '/begin/{print; print f; next}1' input > newfile
必要に応じて、mv
古いファイルを新しいファイルに置き換えることができます。