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

関連情報