我想从中删除一行/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
没有命令,甚至循环结束时的默认值也没有,这将打印所有行p
p
不是已删除。由于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