Text-Processing

sed:刪除文件中的所有匹配項並在第一個匹配項所在的位置插入一些行

  • February 6, 2017

假設我想/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.txtin的文件中有新的伺服器列表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\所有反斜杠和嵌入的換行符更改行時,必須使用反斜杠進行轉義(如我的範例中所示)。

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