전체 단어를 일치시키려고 하면 정규 표현식이 실패합니다.

전체 단어를 일치시키려고 하면 정규 표현식이 실패합니다.

이것은 내 테스트 파일 test.txt입니다.

hello

user1 ALL=(ALL) NOPASSWD: /usr/bin/* /app/tomcat/tomcat*/webapps/*, /usr/bin/rm -rf /app/tomcat/tomcat*/webapps/*,/bin/rm -rf /app/tomcat/tomcat*/webapps/**.sh , /bin/kill -3 *

다음 정규식을 사용하여 필요한 줄을 성공적으로 찾을 수 있었습니다.

grep -P '(^[^#;]ser1.*ALL=\(ALL\) NOPASSWD.*\/app\/tomcat.*$)' test.txt

user1그러나 정규식 대신 전체 단어를 제공하면 ser1일치하는 항목이 없습니다.

다음과 같은 이유로 정규식이 실패합니다.

grep -P '(^[^#;]user1.*ALL=\(ALL\) NOPASSWD.*\/app\/tomcat.*$)' test.txt

user1해당 줄과 일치하도록 정규식을 제공하고 싶습니다 .

뭔가 제안해주실 수 있나요?

답변1

문제는 두 가지를 명시적으로 달성하려고 하지만 두 가지가 서로를 암시한다는 것입니다.

  • 이 줄은 다음으로 끝나야 합니다.user1
  • 줄은 주석 기호( #또는 )로 ;시작 하면 안 됩니다.

#그러나 두 번째 정규 표현식에서는 "행은 또는가 아닌 문자로 시작해야 하며 ;다음을 포함해야 합니다 user1. 따라서 grep앞에 문자가 올 것으로 예상됩니다 user1. 이는 "모든 문자"를 요청하는 첫 번째 정규 표현식에서는 문제가 되지 않습니다. #or 이외 의 문자로 시작하는 것과 마찬가지로 or 이외의 문자 ;뒤에 "가 옵니다 .ser1user1#;

줄이 로 시작한다고 확신하는 경우 user1간단히 다음을 사용할 수 있습니다.

grep -P '^user1 etc.'

혹은 자리가 있을 경우,

grep -P '^ *user1 etc.'

답변2

정규식을 줄 시작 부분에 고정합니다.

^[^#;]ser1

#이는 "or 이외의 문자로 시작하고 ;뒤에 문자열이 오는 일치 라인을 의미합니다 ser1. 따라서 of 와 일치합니다 [^#;]. 전체 단어를 제공하려면 다음으로 직접 시작하는 라인을 찾아야 합니다.uuser1user1

^user1

또는 다음 패턴이 0회 발생하도록 허용합니다 [^#;].

^[^#;]*ser1

따라서 전체 명령은 다음과 같습니다.

grep -P '(^user1.*ALL=\(ALL\) NOPASSWD.*\/app\/tomcat.*$)' test.txt

또는

grep -P '(^[^#;]*user1.*ALL=\(ALL\) NOPASSWD.*\/app\/tomcat.*$)' test.txt

그러나 이는 매우 복잡해 보입니다. 정말로 필요한 것은 다음과 같습니다.

grep -P '^[^#;]*user1'

이 예에서는.

관련 정보