如何使用 sed/awk 將文件中某一行之後的所有文字替換為另一個文字檔案的內容?

如何使用 sed/awk 將文件中某一行之後的所有文字替換為另一個文字檔案的內容?

我目前正在嘗試自動更新標題為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 找到的內容來看,我只能弄清楚如何編輯特定短語之後的行的其餘部分。我想用 replacement_file.txt 中的所有文字替換 original_file.txt 中替換短語後的文字(我想保留替換行文字以供將來更新)。 Original_file.txt 最後應如下所示:

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

先致謝!

答案1

在 GNU/awk 中:

將這兩個檔案命名為參數。

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

這三個sed區塊執行以下操作:

  1. 第一個區塊列印從第 1 行到具有特殊內容的行的所有行。我明確列印這些行p,然後調用d以強制啟動新循環(“ print; next” in awk)。
  2. 在第一個區塊輸出初始行後,第二個區塊輸出額外檔案的內容。
  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

答案4

如果使用 gnu awk:

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

相關內容