다음을 포함하는 "test"라는 파일이 있습니다.
linux
Unixlinux
Linuxunix
it's linux
l...x
이제 :를 사용하면 grep '\<l.*x\>'
다음과 일치합니다.
linux
it's linux
l...x
하지만 을 사용하면 grep '\<l*x\>'
다음과만 일치합니다.
l...x
, 그러나 참조 가이드에 따르면 *를 사용하면 앞의 항목이 0회 이상 일치합니다. 즉, 'l'로 시작하고 'x'로 끝나는 항목과 일치해야 합니다.
예상한 결과가 표시되지 않는 이유를 설명할 수 있는 사람이 있습니까? 아니면 제가 잘못 이해하고 있는 것입니까?
답변1
상징(.*)
정규 표현식의 *와 *는 문자당 문자 수가 아니라 개수를 의미하며 더 정확하게는 의미합니다."0개 이상". 또한,.방법'모든 단일 문자'.
그래서 그것들을 합치면"0개 이상의 문자가 있습니다.". 예를 들어 다음과 같은 문자열은 다음과 같습니다.
- 리눅스
- 린 Nx
- lnx
- 하이리눅스
- 럭스
로 일치합니다 <l.*x>
. 마지막 항목이 중요함을 나타냅니다..*역시 일치할 수 없습니다.
상징(*)
내가 말했듯이 *만이 카운터입니다. 따라서 문자 뒤에 넣으면 다음과 같습니다.'엘'* 말한다'0개 이상의 l'.
를 grep하면 l*x
과 일치 l...x
하지만 생각하는 방식과 다를 수도 있습니다.
% echo "l...x" | grep "l*x"
l...x
후행 "x"와 일치합니다. "l"은 "x" 앞에 "x"가 있다는 점을 제외하면 일치 이유와 아무 관련이 없습니다.'0개 이상의 l'.
답변2
"l"로 시작하고 "x"로 끝나는 모든 항목을 일치시키려면 정규식 "l.*x"를 사용해 보세요. 여기서 "." "*" 및 "*"는 각각 유효한 단일 문자와 길이가 0 이상인 문자를 나타내는 특수 문자입니다. 여기서 "*" 앞에는 "."이 있으므로 "."를 대체할 수 있는 항목은 무엇이든 가능합니다. 위의 "*" 정의에 따라 반복합니다.
답변3
쉘(예: bash)의 경우 clown이 파일 이름을 일치시키는 데 사용되고 문자 자체인 경우 문자를 나타냅니다 *
.?
반면, 정규 표현식의 경우 , *
, (발생 범위) 및 ( 만) ?
은 그 자체로는 아무것도 아닙니다. 항상 이전 문자/원자를 참조합니다. 실제 문자(예: 또는 ) 인지 여부에 관계없이 (조커)는 모든 문자, 문자 범위(예: ) 또는 여러 문자의 패턴(egrep만 해당, 예: - where " 아바"는 하나의 단위로 간주됩니다). 따라서 그 자체로 는 아무 의미가 없지만 이전 문자(하나의 단위로 간주되는 사람 또는 그룹의 광대일 수 있음)가 몇 번 반복되어야 하는지 알려주세요.{n,m}
+
egrep
L
5
.
[a-f]
(abba)
*
?
*
쉘과 정규 표현식이 및 를 사용하는 방식의 차이점을 기억하고 나면 ?
이해가 될 것입니다 .
따라서 정규 표현식의 경우:
.
- 모든 문자의 정확히 한 번 발생을 나타냅니다.a..a
- 두 개의 a와 그 사이의 모든 유형의 두 문자와 일치합니다..*
- 모든 문자가 0개, 1개 이상 일치합니다.B*
- "B"가 0, 1개 이상 일치합니다.