sed + 在行首添加字符串,但如果已经存在则忽略

yae*_*ael 3 linux sed perl text-processing

以下示例如何在与 fstab 中的 UUID 编号匹配时在行首添加字符串

sed -e "/UUID=953b1921-ac73-4b7b-abaf-ff983b0fce8a/ s/^/###FAULTY_DISK###/"  -i /etc/fstab
Run Code Online (Sandbox Code Playgroud)

我们可以验证

more /etc/fstab 

###FAULTY_DISK###UUID=953b1921-ac73-4b7b-abaf-ff983b0fce8a /data/sdc ext4 defaults,noatime 0 0
Run Code Online (Sandbox Code Playgroud)

但在第二次运行时我们得到

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
Run Code Online (Sandbox Code Playgroud)

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

αғs*_*нιη 8

仅当以该 UUID 开头时才追加:

sed -e 's/^UUID=953b1921-ac73-4b7b-abaf-ff983b0fce8a/###FAULTY_DISK###&/' /etc/fstab
Run Code Online (Sandbox Code Playgroud)

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

sed -e 's/^[[:blank:]]*UUID=953b1921-ac73-4b7b-abaf-ff983b0fce8a/###FAULTY_DISK###&/' /etc/fstab
Run Code Online (Sandbox Code Playgroud)


ter*_*don 5

另一种方法是跳过带有 的行###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
Run Code Online (Sandbox Code Playgroud)

您可以使用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
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,该消息仅添加到没有该消息的行中。