Text-Processing
sed:刪除文件中的所有匹配項並在第一個匹配項所在的位置插入一些行
假設我想
/etc/ntp.conf
使用sed
. 格式ntp.conf
允許通過使用相同的關鍵字來定義整個文件中出現的行的列表*。*例如:# first block occurrences server 1.1.1.1 server 2.2.2.2 driftfile /var/lib/ntp/drift # second block of occurrences server 3.3.3.3 server 4.4.4.4
現在,我已經更新了
ntp
伺服器列表,比如 5.5.5.5、6.6.6.6 和 7.7.7.7。結果我想得到:# first block occurrences server 5.5.5.5 server 6.6.6.6 server 7.7.7.7 driftfile /var/lib/ntp/drift # second block of occurrences
我可以這樣做
sed
嗎?它是解決這個問題的正確工具還是我應該使用其他工具?PS:註釋掉第二塊(或兩者)的出現也可能是一種選擇。
如果您在名為
list.txt
in的文件中有新的伺服器列表cwd
:sed '/^server/{x;//!r list.txt d}' /etc/ntp.conf
或者,如果您不想使用文件而是硬編碼新的伺服器名稱:
sed '/^server/{x;//!c\ server 1\ ........\ server n-1\ server n d}' /etc/ntp.conf
這假設您的文件中至少有一條未註釋的
server
行/etc/ntp.conf
(此外,它不會刪除任何server
被註釋掉的行 - 您也可以更改正則表達式以包含這些行)。如果即使原始文件中沒有伺服器條目也想插入這些行(在這種情況下,在文件末尾添加新伺服器),您可以執行以下操作:sed '/^server/{x;//!r list.txt d} ${x;//!r list.txt x}' /etc/ntp.conf
或者如果您喜歡使用相同的條件
c\
- 我將把它留作練習。請記住,當使用c\
所有反斜杠和嵌入的換行符更改行時,必須使用反斜杠進行轉義(如我的範例中所示)。