bash 정규식: 별표 메타 문자로 인해 추가 줄 바꿈이 종료됩니다.

bash 정규식: 별표 메타 문자로 인해 추가 줄 바꿈이 종료됩니다.

검색 작업에서 별표 메타 문자의 기본 기능을 테스트하기 위해 grep다음이 포함된 파일( )을 사용했습니다.regex.txt

$ cat regex.txt
1
11
111
1111
11111





$

내 예에서는 의도적으로 6개의 줄 바꿈이 추가되었습니다 11111.

질문 1.

grep "11*" regex.txt다음 개행 문자를 제외하고 의 출력이 의 출력과 다른 이유는 무엇입니까 ?11111grep "1*" regex.txt

질문 2.

의 출력은 grep "111*" regex.txt다음과 같습니다

11
111
1111
11111

의 출력은 grep "1111*" regex.txt다음과 같습니다

111
1111
11111

의 출력은 grep "11111*" regex.txt다음과 같습니다

1111
11111

검색 키에서 "1"을 증가시킬 때마다 최상위 레이어가 사라지는 이유는 무엇입니까?

답변1

두 가지 질문은 기본적으로 동일합니다. 정규식에서 *"이전 문자와 0회 이상 일치"를 의미합니다. 따라서 1*0 이상과 일치 1하지만11*1 이미 팔로우 중0 이상 1. 이것은 의미한다

  • grep "11*"다음을 포함하는 줄만 인쇄합니다.적어도하나 1. *두 번째 항목에만 적용되므로 첫 1번째 항목은 필수입니다. 그렇기 때문에 빈 줄이 보이지 않고 일치하지 않습니다 1.

  • grep "1*"0 이상과 일치합니다 1. 여기에는 일치해야 할 선행 문자가 없으므로 빈 줄에는 0이 포함되어 있으므로 일치합니다 1.

  • grep "111*"grep "1111*"불일치 의 이유는 위의 첫 번째 항목과 동일합니다. 111*다음을 포함하는 줄만 인쇄합니다.적어도2 1, 아마도 그 이상. 1111*다음을 포함하는 행과 일치합니다.적어도3 1, 아마도 그 이상.

여기서 중요한 점은 *전체 패턴이 아니라 바로 앞의 문자만 영향을 받는다는 것입니다. 전체 패턴에 수량자를 제공하려면 괄호를 사용할 수 있습니다.

$ grep '\(111\)*' regex.txt 
1
11
111
1111
11111





$    

\여기서 대괄호( 검색 패턴에 포함되지 않도록 이스케이프해야 함 )는 문자를 그룹화하여 *그룹에 적용됩니다. 위에서 볼 수 있듯이 0개 이상의 항목이 포함된 행과 일치하므로 111모든 행을 인쇄합니다.

답변2

'1*'0개 이상의 1자를 선택하세요. 1값이 1인 문자를 선택합니다. 빈 줄에는 1인 문자가 포함되어 있지 않지만하다하나인 문자가 없습니다.

관련 정보