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