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예에스다루다응급실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