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

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

以下示例如何在与 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 中设置

答案1

仅当以该 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

答案2

另一种方法是跳过带有 的行###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

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

答案3

如果我理解正确的话:

鉴于

##FAULTY_DISK###UUID=953b1921-ac73-4b7b-abaf-ff983b0fce8a
UUID=953b1921-ac73-4b7b-abaf-ff983b0fce8a

然后

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

答案4

使用(以前称为 Perl_6)

raku -pe 's/ ^ ("UUID=86d58af9-801b-4c25-b59d-80b52b4acc61") /\#\#\#FAULTY_DISK\#\#\#$0/;' fstab_test.txt

或者

raku -pe 's[ ^ ("UUID=86d58af9-801b-4c25-b59d-80b52b4acc61") ] = "\#\#\#FAULTY_DISK\#\#\#$0";'

上面的答案是用 Raku(Perl 编程语言家族的成员)编写的。一旦前面加上###FAULTY_DISK###,文件中的一行在fstab同一 Raku 单行的后续运行期间将被忽略,即修改是稳定的。

请参阅下面的链接了解示例输入和示例输出。

https://unix.stackexchange.com/a/689556/227738

相关内容