テキストファイルの特定の単語の後に変数を追加するには?

テキストファイルの特定の単語の後に変数を追加するには?

テキストファイルの「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つ挿入します。

おすすめ記事