web-dev-qa-db-ja.com

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

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

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

このファイルは、「この行の後のすべてを置換する」の後のすべてのテキストを削除し、ファイルreplacement_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

前もって感謝します!

8
ddantas

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

通常、3番目のブロックのqは、終了する前に現在の行を出力します(これは_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
_
7
Kusalananda

GNU/awkの場合:

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

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

"replace after"行が見つかるまですべての行を出力し、他のファイルから読み込んで終了します。

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

  • sed -iを使用して変更を保存します
  • または... > tmp && mv tmp original
14
rowboat

これは、awkとcatを使用して効率的に機能します。

$ awk '{print} /### REPLACE EVERYTHING AFTER THIS LINE ###/{exit}' original_file.txt &&
    cat replacement_file.txt
common_text
### REPLACE EVERYTHING AFTER THIS LINE ###
testing123
this_is_the_replacement_text

他のUNIXツールと同様に、元のファイルを更新するには、出力を一時ファイルに書き込んでから、元のファイルをその一時ファイルに置き換えます。

{ awk '{print} /### REPLACE EVERYTHING AFTER THIS LINE ###/{exit}' original_file.txt &&
   cat replacement_file.txt; } > tmp && mv tmp original_file.txt
6
Ed Morton

gNU AWKを使用している場合:

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

edファイルにする場合は、edよりもsedを優先してください。

ed -s original_file.txt <<'EOF'
/^### REPLACE/+1,$d
r replacement_file.txt
w
EOF

replace行の後のすべてを削除し、他のファイルの内容を挿入して、変更を保存します。

3
Shawn

テストして正常に動作した

コマンド

sed  -ni -e   '1,/#/p' -e '/#/r replacement_file.txt'  titled original_file.txt

出力

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