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
选项将更改写入文件。之后文件完全为空,我不知道为什么。
该/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)