sed에서 정규식을 사용하는 방법은 무엇입니까?

sed에서 정규식을 사용하는 방법은 무엇입니까?

스크립트에서 sed를 사용하는 사용자에 대한 sudo 액세스 권한을 취소해야 합니다.
행에 /bin/su가 포함된 경우에만 사용자에게 주석을 달고 싶습니다. - root
첫 번째 행에만 주석을 달아야 하는 다음 파일을 고려해 보겠습니다.

mindadmin  ALL = NOPASSWD: /bin/su - root
mindadmin  ALL = NOPASSWD: /bin/ifconfig

내가 사용한 명령은 sed다음과 같습니다.

sed -e 's/minadmin[\s]+ALL[\s]+=[\s]+NOPASSWD:[\s]+/bin/su - root/#mindadmin  ALL = NOPASSWD: /bin/su - root/g' /etc/sudoers 

하지만 작동하지 않습니다. 문법적 오류가 있나요?

답변1

두 가지 문제가 있습니다. 첫 번째는 sudoershas mindadmin와 mode minadmin(nothing d)입니다.

두 번째 문제는 /s 의 /bin/su정규 표현식에서 다음을 이스케이프 처리해야 한다는 것입니다.

sed -e 's/mindadmin[\s]+ALL[\s]+=[\s]+NOPASSWD:[\s]+\/bin\/su - root/#mindadmin  ALL = NOPASSWD: \/bin\/su - root/g' /etc/sudoers

그렇지 않으면 패턴이 종료됩니다.

대신 다른 구분 기호를 선택할 수도 /있으며 파일에 해당 구분 기호가 나타나지 않는 한 이스케이프할 필요가 없습니다.

답변2

 sed  '/\/bin\/su - root/ s/^/#/'  filename

파일 이름에 포함된 줄을 찾아 /bin/su - root줄 시작 부분에 주석(#)(^)을 추가합니다.

파일에 영향을 미치도록 sed에 옵션을 추가합니다 -i.

답변3

/bin/su - root줄 끝을 포함하여 모든 줄을 주석 처리하려면 sed 표현식을 단순화하면 됩니다.

sed 's/.*\/bin\/su - root$/#&/'

아니면 더 간단하게

sed 's,.*/bin/su - root$,#&,'

/bin/su - root포함 라인의 모든 라인을 주석 처리하려면 다음을 수행하십시오 .

sed 's,.*/bin/su - root,#&,'

답변4

&일치하는 패턴 전체가 교체되므로 또 다른 해결 방법은 다음과 같습니다 .

sed -i 's,.*/bin/su\s\+-\s+root,#&,' /etc/sudoers

/다른 구분 기호로 대체되므로 이스케이프할 필요가 없습니다. su 명령 뒤의 간격이 다른 경우에도 이 모드는 더 유연합니다.

최소값만 변경하는 경우관리자 사용자:

sed -i 's,^mindadmin\s.*/bin/su\s+-\+root,#&,' /etc/sudoers

플래그 -i는 변경 사항을 파일에 직접 적용합니다.

관련 정보