テキストブロックをファイルの内容に置き換える

テキストブロックをファイルの内容に置き換える

テキストファイルf1の$ Elements $と$ EndElements $の間の内容を別のファイルf2のデータに置き換えたいと思います。

f1の内容は、単に次のように与えられる。

$Elements$
3
1
5
7
$EndElements$

f2の内容は次のとおりです。

1 65 71
2 32 87
3 39 98
4 41 63

私が思いついた最後のものは次のとおりです。

$Elements$
1 65 71
2 32 87
3 39 98
4 41 63
$EndElements$

これを行うには、stackexchangeページでいくつかのsedコードを試しました。 (コードをコピーしましたが、ウィンドウが開いていないため、直接リンクを提供できませんでした。申し訳ありません。)

lead='^\$Elements\$$' 
tail='^\$EndElements\$$'
# f2 is the file where the information
# to replace is kept in 
sed -e "/$lead/,/$tail/{ /$lead/{p; r insert_file
    >         }; /$tail/p; d }"  f2

これはうまくいきません。基本的には何もしません。

答え1

そしてed(1)

echo -e '/\$Elements\$/+1,/\$EndElements\$/-1d\n.-1r f2\nw' | ed -s f1

詳細:

  • /\$Elements\$/+1,/\$EndElements\$/-1$Elements$との間の一致線$EndElements$
  • dその行を削除
  • .-1今上の行$EndElements$
  • r f2ファイルを読むf2
  • w結果を作成します。

答え2

sed -e "
   /$lead/,/$tail/!b
   //!d
   /$lead/r f2
" f1

結果

$Elements$
1 65 71
2 32 87
3 39 98
4 41 63
$EndElements$

布材

  1. まず、,コンマ演算子を使用して適切な範囲を選択します。
  2. bこの範囲内にないすべての行は、その行のsedコードの末尾に制御を分岐するコマンドを介してそのまま印刷されます。
  3. //!d範囲本文をカスタムファイルf2に置き換えようとすると、範囲本文が削除されます。
  4. 先頭行が表示されたら、カスタムファイルf2の内容を印刷キューに読み込みます(これはパターンスペースと同じではありません)。
  5. 制御がsedコードの終わりに達すると、パターンスペースの内容(リーダーラインをstdoutに空にする)と、このイベントの後にキューの内容がstdoutに空になります。

関連情報