‘[az] *’가 알파벳이 아닌 문자열과 일치하는 이유는 무엇입니까? 결과가 나오는 이유에 대해 혼란 스럽습니다

alphanum이 두 줄 의 파일 이 있습니다.

123 abc
this is a line

내가 실행할 때 sed 's/[a-z]*/SUB/' alphanum다음과 같은 결과가 나오는 이유에 대해 혼란 스럽습니다 .

SUB123 abc
SUB is a line

나는 기대했다 :

123 SUB
SUB is a line

수정 프로그램을 찾았 sed 's/[a-z][a-z]*/SUB/'지만 ( 대신 사용) 왜 작동하는지 이해하지 못합니다.

도울 수 있니?



답변

패턴이 [a-z]*일치 제로 범위 이상의 문자 a행을 z합니다 ( 실제 문자는 현재의 지역에 의존한다). 문자열의 맨 처음에는 그러한 문자가없고 123 abc(즉, 패턴 일치) 또한 시작시에는 그 중 4 개가 있습니다 this is a line.

당신이 적어도 필요한 경우 경기를 한 후 사용 [a-z][a-z]*하거나 [a-z]\{1,\}, 또는으로 확장 된 정규 표현식을 사용 sed -E하고 사용 [a-z]+.

패턴이 일치하는 위치를 시각화하려면 각 일치 주위에 괄호를 추가하십시오.

$ sed 's/[a-z]*/(&)/' file
()123 abc
(this) is a line

또는 줄의 모든 일치 항목을 보려면

$ sed 's/[a-z]*/(&)/g' file
()1()2()3() (abc)
(this) (is) (a) (line)

마지막 결과와

$ sed -E 's/[a-z]+/(&)/g' file
123 (abc)
(this) (is) (a) (line)

답변

이 때문에 *경기는 0 개 이상의 이전 원자의 반복, 모든 정규식 엔진이 첫 번째 일치를 찾아보십시오. 문자열 시작 부분에 정확히 0 문자의 하위 문자열이 있으므로 일치하는 곳입니다. 문자열이 문자로 시작하는 경우 가능한 한 *일치하지만 가장 왼쪽 일치 항목을 찾는 것이 보조입니다.

길이가 0 인 일치는 약간 문제가 될 수 있으며 보시다시피 해결책은 하나 이상의 문자가 필요하도록 패턴을 수정하는 것입니다. 확장 정규식을 사용하면 다음과 같은 이점을 얻을 수 있습니다 +.sed -E 's/[a-z]+/SUB/'

재미를 위해 다음을 시도하십시오.

echo 'less than 123 words' | sed 's/[0-9]*/x/g'