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

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

我想从中删除一行/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

我的脚本:

MNTDIR="/mnt/wsbackup"
if grep -q "$MNTDIR" "/etc/fstab"
then
 sed -i -n "\:$MNTDIR:d" /etc/fstab
else
 ...
fi

如果我在脚本中使用该命令,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

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

答案1

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

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

使用-n,您的脚本实际上不会输出任何内容,即使您删除该选项也不会输出任何内容,因为脚本中-i没有命令,甚至循环结束时的默认值也没有,这将打印所有行pp不是已删除。由于sed脚本不输出任何内容,因此指示sed就地进行更改会-i清空文件。

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


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

mntdir=/mnt/wsbackup

cp /etc/fstab /etc/fstab.orig
sed "\\:$mntdir:d" /etc/fstab.orig >/etc/fstab

这使我们能够保留原始文件的副本fstab

或者,

mntdir=/mnt/wsbackup

sed -i.orig "\\:$mntdir:d" /etc/fstab

这会做几乎相同的事情,具体取决于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

相关内容