검색 작업에서 별표 메타 문자의 기본 기능을 테스트하기 위해 grep
다음이 포함된 파일( )을 사용했습니다.regex.txt
$ cat regex.txt
1
11
111
1111
11111
$
내 예에서는 의도적으로 6개의 줄 바꿈이 추가되었습니다 11111
.
질문 1.
grep "11*" regex.txt
다음 개행 문자를 제외하고 의 출력이 의 출력과 다른 이유는 무엇입니까 ?11111
grep "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*
다음을 포함하는 줄만 인쇄합니다.적어도21
, 아마도 그 이상.1111*
다음을 포함하는 행과 일치합니다.적어도31
, 아마도 그 이상.
여기서 중요한 점은 *
전체 패턴이 아니라 바로 앞의 문자만 영향을 받는다는 것입니다. 전체 패턴에 수량자를 제공하려면 괄호를 사용할 수 있습니다.
$ grep '\(111\)*' regex.txt
1
11
111
1111
11111
$
\
여기서 대괄호( 검색 패턴에 포함되지 않도록 이스케이프해야 함 )는 문자를 그룹화하여 *
그룹에 적용됩니다. 위에서 볼 수 있듯이 0개 이상의 항목이 포함된 행과 일치하므로 111
모든 행을 인쇄합니다.
답변2
'1*'
0개 이상의 1자를 선택하세요. 1
값이 1인 문자를 선택합니다. 빈 줄에는 1인 문자가 포함되어 있지 않지만하다하나인 문자가 없습니다.