Shell-Script

sed 命令用另一個文件的內容替換文件中最後出現的單詞

  • May 28, 2021
  1. macOSsed命令替換文件中最後一次出現的單詞
  2. 替換為另一個文件中的內容
  3. 僅替換最後一次出現,意味著僅一次。
  4. 該單詞可以是子字元串abchellohelloabc
  5. 單詞後面可以有尾隨空格或換行符

sample_file_path = “/Users/saurav/sample.text” sample_file_path_1 = “/Users/saurav/sample1.text”

sample.txt:

hello
hi
hello
ok

sample1.txt:

I
am 
doing
great

預期輸出(sample.txt):

hello
hi
I
am 
doing
great
ok

需要使用文件路徑變數

在三個步驟中,使用與macOS 上sed兼容的語法,或者(目前 macOS 系統上的兩個主要 shell):/usr/bin/sed``bash``zsh

sed -n '/hello/=' sample.txt |
sed -e '$!d' -e $'s/.*/&r sample1.txt\\\n&d/' |
sed -f /dev/stdin sample.txt

sed分三個步驟使用:

  1. sample.txt查找匹配的所有行hello並輸出與這些行對應的行號。
  2. 刪除除第一步輸出的最後一行以外的所有行號(使用$!d,“如果這不是最後一行,請刪除它”),並創建一個兩行sed腳本,該腳本將通過首先讀取sample1.txt然後刪除最後匹配行來修改原線。鑑於最後一個匹配hello是在原始文件的第 3 行,這個腳本看起來像
3r sample1.txt
3d
  1. 將建構的sed腳本應用於文件sample.txt

您是否要“就地”進行編輯,以便sample.txt修改原始內容,然後使用

sed -n '/hello/=' sample.txt |
sed -e '$!d' -e $'s/.*/&r sample1.txt\\\n&d/' |
sed -i '' -f /dev/stdin sample.txt

相同的命令集,但使用您的變數$sample_file_path$sample_file_path_1兩個文件路徑:

sed -n '/hello/=' "$sample_file_path" |
sed -e '$!d' -e 's,.*,&r '"$sample_file_path_1"$'\\\n&d,' |
sed -i '' -f /dev/stdin "$sample_file_path"

請注意,我已將第二個命令中的分隔符從/更改,為 ,因為文件路徑包含斜杠。s///您可以在命令中使用不屬於正則表達式或替換文本的任何字元作為分隔符。

引用自:https://unix.stackexchange.com/questions/651315