私は現在、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
前もって感謝します!
sed
の使用:
_sed -n -e '1,/^### REPLACE EVERYTHING AFTER THIS LINE ###$/{ p; d; }' \
-e 'r replacement_file.txt' \
-e 'q' original_file.txt
_
3つのsed
ブロックがこれを行います:
p
で明示的に出力し、次にd
を呼び出して、新しいサイクルを強制的に開始します(awk
の "_print; next
_")。通常、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
_
GNU/awkの場合:
2つのファイルに引数として名前を付けます。
awk '{ print; } /^### REPLACE EVERYTHING AFTER THIS LINE ###$/ { nextfile; }' fn1 fn2
"replace after"行が見つかるまですべての行を出力し、他のファイルから読み込んで終了します。
sed '/^### REPLACE EVERYTHING AFTER THIS LINE ###$/{r replacement_file.txt
q;}' original_file.txt
sed -i
を使用して変更を保存します... > tmp && mv tmp original
これは、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
gNU AWKを使用している場合:
awk '{print} /### REPLACE.../{system("cat replacement"); exit 0}' file
edファイルにする場合は、ed
よりもsed
を優先してください。
ed -s original_file.txt <<'EOF'
/^### REPLACE/+1,$d
r replacement_file.txt
w
EOF
replace行の後のすべてを削除し、他のファイルの内容を挿入して、変更を保存します。
テストして正常に動作した
コマンド
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