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 中设置
仅当以该 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)
另一种方法是跳过带有 的行###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)
正如您所看到的,该消息仅添加到没有该消息的行中。