sed 删除所有行而不是选中的一行

Her*_*zog 3 sed text-processing

我想从中删除一行/etc/fstab并使用该sed命令,但它删除了我文件中的所有内容。

我的fstab

/dev/mapper/vg00-lv_root /                       xfs     defaults        0 0
/dev/mapper/vg00-lv_backup /backup                 xfs     defaults        0 0
UUID=30d58f5e-a432-4739-98f9-3f2ceb66fc03 /boot                   ext4    defaults        1 2
/dev/mapper/vg00-lv_wsbackup /wsbackup               xfs     defaults        0 0
UUID=a59bad9c-8c89-4b20-aadd-e83c4ab22a6c swap                    swap    defaults        0 0
10.10.10.10 /mnt/wsbackup cifs user=user,password=password,domain=domain,vers=2.1 0 0
Run Code Online (Sandbox Code Playgroud)

我的脚本:

/dev/mapper/vg00-lv_root /                       xfs     defaults        0 0
/dev/mapper/vg00-lv_backup /backup                 xfs     defaults        0 0
UUID=30d58f5e-a432-4739-98f9-3f2ceb66fc03 /boot                   ext4    defaults        1 2
/dev/mapper/vg00-lv_wsbackup /wsbackup               xfs     defaults        0 0
UUID=a59bad9c-8c89-4b20-aadd-e83c4ab22a6c swap                    swap    defaults        0 0
10.10.10.10 /mnt/wsbackup cifs user=user,password=password,domain=domain,vers=2.1 0 0
Run Code Online (Sandbox Code Playgroud)

如果我sed "\:$MNTDIR:d" /etc/fstab在我的脚本中使用该命令,我得到的输出看起来就像我想要的:

[root@labor-ssd ~]# sh check.sh
/dev/mapper/vg00-lv_root /                       xfs     defaults        0 0
/dev/mapper/vg00-lv_backup /backup                 xfs     defaults        0 0
#/dev/sdb /backup       ext4 defaults   0 0
UUID=30d58f5e-a432-4739-98f9-3f2ceb66fc03 /boot                   ext4    defaults        1 2
/dev/mapper/vg00-lv_wsbackup /wsbackup               xfs     defaults        0 0
UUID=a59bad9c-8c89-4b20-aadd-e83c4ab22a6c swap                    swap    defaults        0 0
INFO: user mount configuration removed
Run Code Online (Sandbox Code Playgroud)

但是更改不会写入文件,因此我使用该-i选项将更改写入文件。之后文件完全为空,我不知道为什么。

Kus*_*nda 7

/etc/fstab文件变空,因为您不仅在使用,-i而且还在使用-n.

-n选项关闭p通常在每个周期结束时触发的“默认(打印)命令”。

使用-n,您的脚本确实不会输出任何内容,即使您删除该-i选项也不会,因为p脚本中没有命令,甚至p循环结束时的默认值也没有,它会打印所有删除的行。由于sed脚本不输出任何内容,因此告诉sed在原地进行更改会-i清空文件。

因此,要解决您的问题,请-n从您的命令中删除。


就个人而言,我会把代码写成

mntdir=/mnt/wsbackup

cp /etc/fstab /etc/fstab.orig
sed "\\:$mntdir:d" /etc/fstab.orig >/etc/fstab
Run Code Online (Sandbox Code Playgroud)

这允许我们保留原始fstab文件的副本。

或者,

mntdir=/mnt/wsbackup

sed -i.orig "\\:$mntdir:d" /etc/fstab
Run Code Online (Sandbox Code Playgroud)

这将做几乎相同的事情,具体取决于sed您使用的实现。

grep -q -F -e "$mntdir" /etc/fstab如果在文件中$mntdir找不到字符串,则需要避免对文件执行任何操作,请将其包装在测试中(类似于您已经执行的操作),即

mntdir=/mnt/wsbackup

grep -q -F -e "$mntdir" /etc/fstab &&
sed -i.orig "\\:$mntdir:d" /etc/fstab
Run Code Online (Sandbox Code Playgroud)