sed/awk を使用して、ファイル内の特定の行以降のすべてのテキストを別のテキスト ファイルの内容に置き換えるにはどうすればよいですか?

sed/awk を使用して、ファイル内の特定の行以降のすべてのテキストを別のテキスト ファイルの内容に置き換えるにはどうすればよいですか?

現在、original_file.txt というファイルのテキストの更新を自動化しようとしています。ファイルが次のようになっていると想像してください。

common_text
### REPLACE EVERYTHING AFTER THIS LINE ###
text_that_will
be_removed
after_the_command

このファイルは、「この行の後のすべてを置き換える」以降のすべてのテキストを削除し、ファイル内のテキストに置き換えることによって更新されます。置換ファイル.txt. この投稿では、replacement_file.txt に次のテキストが含まれていると仮定します。

testing123
this_is_the_replacement_text

sed で見つけたものから、特定のフレーズの後の行の残りを編集する方法しかわかりません。original_file.txt の置換フレーズの後のテキストを replacement_file.txt のすべてのテキストに置き換えたいです (将来の更新のために置換行のテキストを保持したいです)。original_file.txt は最終的に次のようになります。

common_text
### REPLACE EVERYTHING AFTER THIS LINE ###
testing123
this_is_the_replacement_text

前もって感謝します!

答え1

GNU/awk の場合:

引数として 2 つのファイルに名前を付けます。

awk '{ print; } /^### REPLACE EVERYTHING AFTER THIS LINE ###$/ { nextfile; }' fn1 fn2

答え2

「置換後」行が見つかるまですべての行を印刷し、その後他のファイルから読み取って終了します。

sed '/^### REPLACE EVERYTHING AFTER THIS LINE ###$/{r replacement_file.txt
q;}' original_file.txt

  • sed -i変更を保存するために使用
  • または... > tmp && mv tmp original

答え3

使用方法sed:

sed -n -e '1,/^### REPLACE EVERYTHING AFTER THIS LINE ###$/{ p; d; }' \
       -e 'r replacement_file.txt' \
       -e 'q' original_file.txt

3 つのsedブロックは次のことを行います。

  1. 最初のブロックは、1 行目から特別な内容の行までのすべての行を出力します。これらの行を で明示的に出力しp、 を呼び出してd新しいサイクルを強制的に開始します ( 内の " print; next" awk)。
  2. 最初のブロックによって最初の行が出力された後、2 番目のブロックは追加ファイルの内容を出力します。
  3. その後、編集スクリプトは終了します。

通常、q3 番目のブロックでは、終了する前に現在の行を出力します (これは、サンプル データ読み取り の行になりますtext_that_will)。ただし、sedは で呼び出されるため-n、サイクルの終了時に行を出力するというこのデフォルトの動作は抑制されます。

上記のコマンドの結果は、あなたのデータに基づいて、

common_text
### REPLACE EVERYTHING AFTER THIS LINE ###
testing123
this_is_the_replacement_text

元のファイルを更新するには、 を使用するsed -i ...か、出力を新しいファイルにリダイレクトして、元のファイルを次のファイルに置き換えます。

sed ... original_file.txt >original_file.txt.new &&
mv original_file.txt.new original_file.txt

答え4

gnu Awk を使用する場合:

awk '{print} /### REPLACE.../{system("cat replacement"); exit 0}' file

関連情報