fstabの特定の行にコメントを付けたりコメントを解除したりできるスクリプトを作成しようとしています。
パラメータがパスでない場合は正常に機能します。
# add comment
sed -i '/db1/s/^/#DO NOT EDIT THIS LINE /g' /etc/fstab
# remove comment
sed -i '/db1/s/^#DO NOT EDIT THIS LINE //g' /etc/fstab
ただし、スラッシュを含む変数を使用しようとすると機能しません。
このような項目が複数ある場合は、そのうちのいくつかについてのみコメントをお願いします。
/dev/disk/by-uuid/f40f5a40-4772-479e-9041-330c3afbfb40 /oradata/db1 auto nosuid,nodev,nofail,x-gvfs-show 0 0
/dev/disk/by-uuid/f40f5a40-4772-479e-9041-330c3afbfb40 /oradata/db2 auto nosuid,nodev,nofail,x-gvfs-show 0 0
/dev/disk/by-uuid/f40f5a40-4772-479e-9041-330c3afbfb40 /oradata/db3 auto nosuid,nodev,nofail,x-gvfs-show 0 0
さまざまな解決策を試しましたが、何も機能しません。誰もが正しい方向に私を指すことができますか?
ありがとう
答え1
このように:
sed -i '/db1/s/^/#/g' /etc/fstab
または真珠より強力な一致:
perl -i -pe 's/^/#/g if m!/oradata/db1!' /etc/fstab
より強力なマッチングが必要な場合sed
:
sed -i '/oradata\/db1/s/^/#/g' /etc/fstab
出力
#/dev/disk/by-uuid/f40f5a40-4772-479e-9041-330c3afbfb40 /oradata/db1 auto nosuid,nodev,nofail,x-gvfs-show 0 0
/dev/disk/by-uuid/f40f5a40-4772-479e-9041-330c3afbfb40 /oradata/db2 auto nosuid,nodev,nofail,x-gvfs-show 0 0
/dev/disk/by-uuid/f40f5a40-4772-479e-9041-330c3afbfb40 /oradata/db3 auto nosuid,nodev,nofail,x-gvfs-show 0 0
答え2
よく考えたSEDはいS扱う緊急室ed
または、次のように使用できます。
ed -s /etc/fstab <<< $'/db1/s/^/#/\n,p'
上記の結果が良く見える場合は、p
endを次のように置き換えてください。w
p
=印刷
w
=書き込み
すべての項目をグローバルに置き換えるには、次のコマンドを実行できます。
ed -s /etc/fstab <<< $'g/db1/s/^/#/\n,p'
ファイルに書き込むp
には、に戻ります。w
これは、これを行うには別の方法が<<<
必要なためです。bash
Bourne シェルを次のように使用します。printf
printf '%s\n' 'g/db1/s/^/#/' w q | ed -s /etc/fstab
または Bourne シェルはありません。printf
ed -s /etc/fstab <<!
g/db1/s/^/#/
w
q
!
答え3
かなりのテストの終わりに問題の解決策を見つけました。
デフォルトでは、MOUNTPOINT変数をエスケープ文字が追加されたマウントポイントパスを含む他の変数に置き換える必要がありました。
MOUNTPOINTF="${MOUNTPOINT////\\/}
#!/bin/sh
FILE="./fstab"
TAG="#DO NOT EDIT THIS LINE "
COMMAND="do_mount"
f_usage(){
echo "usage: sudo_mount_oradata1.sh -h"
echo " sudo_mount_oradata1.sh -m /oradata1 [-u]"
exit 1;
}
f_mount() {
if grep -q "${MOUNTPOINT}" $FILE ; then
if grep -q "${TAG}" $FILE ; then
sed -i.bak "/${MOUNTPOINTF}/s/^${TAG}//g" $FILE
else
echo "INFO: fstab does not contains a commented entry for ${MOUNTPOINT}."
fi
else
echo "INFO: fstab does not contains an entry for ${MOUNTPOINT}."
fi
}
f_unmount() {
if grep -q "${MOUNTPOINT}" $FILE ; then
if grep -q "${TAG}" $FILE ; then
echo "INFO: Entry for ${MOUNTPOINT} is already commented in fstab."
else
sed -i.bak "/${MOUNTPOINTF}/s/^/${TAG} /g" $FILE
fi
else
echo "INFO: fstab does not contains an entry for ${MOUNTPOINT}."
fi
}
while getopts m:u opt
do
case "$opt" in
m) MOUNTPOINT="${OPTARG}" ; MOUNTPOINTF="${MOUNTPOINT////\\/}" ;;
u) COMMAND="do_unmount" ;;
*) f_usage ;;
esac
done
clear
# remove leading whitespace from each line
sed -i "s/^[ \t]*//" $FILE
case "$COMMAND" in
do_mount) f_mount ;;
do_unmount) f_unmount ;;
esac
# remove leading whitespace from each line
sed -i "s/^[ \t]*//" $FILE
# debug
echo;
cat $FILE
echo;
ls -lh $FILE*
exit 0