Sed
用文件的內容替換一段文本
我想替換之間的內容 $ Elements $ 和 $ EndElements $ 在文本文件 f1 中,包含來自另一個文件 f2 的數據。
f1 的內容簡單地由下式給出
$Elements$ 3 1 5 7 $EndElements$
f2 的內容為
1 65 71 2 32 87 3 39 98 4 41 63
最後我想得到的是:
$Elements$ 1 65 71 2 32 87 3 39 98 4 41 63 $EndElements$
為此,我嘗試了一些來自 stackexchange 頁面的 sed 程式碼(好吧,我複制了程式碼並且不再打開視窗,所以我無法提供直接連結,抱歉)
lead='^\$Elements\$$' tail='^\$EndElements\$$' # f2 is the file where the information # to replace is kept in sed -e "/$lead/,/$tail/{ /$lead/{p; r insert_file > }; /$tail/p; d }" f2
這不起作用,基本上什麼都不做。
與
ed(1)
:echo -e '/\$Elements\$/+1,/\$EndElements\$/-1d\n.-1r f2\nw' | ed -s f1
詳細地:
/\$Elements\$/+1,/\$EndElements\$/-1
匹配和之間的$Elements$
線$EndElements$
d
刪除所述行.-1
現在是上面的行$EndElements$
r f2
讀取文件f2
w
寫入結果。
sed -e " /$lead/,/$tail/!b //!d /$lead/r f2 " f1
結果
$Elements$ 1 65 71 2 32 87 3 39 98 4 41 63 $EndElements$
在職的
- 首先,我們使用
,
逗號運算符選擇合適的範圍。- 所有不在此範圍內的行都通過
b
命令按原樣列印,該命令將控制分支到此行的 sed 程式碼的末尾。- 範圍的主體被刪除,
//!d
因為我們打算用自定義文件 f2 替換範圍的主體。- 遇到引導行時,將自定義文件的內容讀入, f2 進入列印隊列(這與模式空間不同,請注意。)
- 當控制項到達 sed 程式碼的末尾時,模式空間的內容,將引導行保持為清空到 stdout,並且在此事件之後,隊列的內容被清空到 stdout。