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

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

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

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

このファイルは、「この行の後のすべての項目を置き換える」以降のすべてのテキストを削除し、ファイルのテキストに置き換える方法で更新されます。file.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

「replace after」行が見つかるまですべての行を印刷してから、別のファイルから読み込んで終了します。

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" in awk)を強制的に開始するように呼び出します。
  2. 最初のブロックが最初の行を出力した後、2番目のブロックは追加ファイルの内容を出力します。
  3. その後、編集スクリプトが終了します。

通常、q3番目のブロックでは現在の行が終了する前に出力されますが(これは読み取られたサンプルデータの行になります)、callの使用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

関連情報