
現在、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 行目から特別な内容の行までのすべての行を出力します。これらの行を で明示的に出力し
p
、 を呼び出してd
新しいサイクルを強制的に開始します ( 内の "print; next
"awk
)。 - 最初のブロックによって最初の行が出力された後、2 番目のブロックは追加ファイルの内容を出力します。
- その後、編集スクリプトは終了します。
通常、q
3 番目のブロックでは、終了する前に現在の行を出力します (これは、サンプル データ読み取り の行になります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