Sed

用文件的內容替換一段文本

  • March 20, 2019

我想替換之間的內容 $ 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$

在職的

  1. 首先,我們使用,逗號運算符選擇合適的範圍。
  2. 所有不在此範圍內的行都通過b命令按原樣列印,該命令將控制分支到此行的 sed 程式碼的末尾。
  3. 範圍的主體被刪除,//!d因為我們打算用自定義文件 f2 替換範圍的主體。
  4. 遇到引導行時,將自定義文件的內容讀入, f2 進入列印隊列(這與模式空間不同,請注意。)
  5. 當控制項到達 sed 程式碼的末尾時,模式空間的內容,將引導行保持為清空到 stdout,並且在此事件之後,隊列的內容被清空到 stdout。

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