Linux

sed + 在行首添加字元串,但如果已經存在則忽略

  • February 7, 2022

這是範例如何在與 fstab 中的 UUID 編號匹配時在行首添加字元串

sed -e "/UUID=953b1921-ac73-4b7b-abaf-ff983b0fce8a/ s/^/###FAULTY_DISK###/"  -i /etc/fstab

我們可以驗證

more /etc/fstab 

###FAULTY_DISK###UUID=953b1921-ac73-4b7b-abaf-ff983b0fce8a /data/sdc ext4 defaults,noatime 0 0

但在第二次執行時我們得到

sed -e "/UUID=953b1921-ac73-4b7b-abaf-ff983b0fce8a/ s/^/###FAULTY_DISK###/"  -i /etc/fstab


more /etc/fstab
###FAULTY_DISK######FAULTY_DISK###UUID=953b1921-ac73-4b7b-abaf-ff983b0fce8a /data/sdc ext4 defaults,noatime 0 0

如何告訴 sed 忽略添加###FAULTY_DISK###,以防它已經在文件 fstab 中設置

僅當它以該 UUID 開頭時才附加:

sed -e 's/^UUID=953b1921-ac73-4b7b-abaf-ff983b0fce8a/###FAULTY_DISK###&/' /etc/fstab

或者,如果您也想忽略前導空格(如果有的話):

sed -e 's/^[[:blank:]]*UUID=953b1921-ac73-4b7b-abaf-ff983b0fce8a/###FAULTY_DISK###&/' /etc/fstab

另一種方法是跳過帶有###FAULTY_DISK###. 考慮這個範例文件,其中一行帶有錯誤磁碟註釋,另一行沒有:

$ cat fstab 
UUID=953b1921-ac73-4b7b-abaf-ff983b0fce8a /data/sdc ext4 defaults,noatime 0 0
###FAULTY_DISK###UUID=953b1921-ac73-4b7b-abaf-ff983b0fce8a /data/sdc ext4 defaults,noatime 0 0

您可以使用n命令 insed移動到下一行。因此sed,如果此行與錯誤消息匹配,請告訴移動到下一行:

$ sed  "/###FAULTY_DISK###/n; s/UUID=953b1921-ac73-4b7b-abaf-ff983b0fce8a/###FAULTY_DISK###&/" fstab 
###FAULTY_DISK###UUID=953b1921-ac73-4b7b-abaf-ff983b0fce8a /data/sdc ext4 defaults,noatime 0 0
###FAULTY_DISK###UUID=953b1921-ac73-4b7b-abaf-ff983b0fce8a /data/sdc ext4 defaults,noatime 0 0

如您所見,該消息僅添加到沒有它的行中。

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