'[az]*'가 알파벳이 아닌 문자열과 일치하는 이유는 무엇입니까?

'[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/'지만 그것이 작동하는 이유와 내 작동하지 않는 이유를 이해할 수 없습니다.

도와주세요?

답변1

패턴 [a-z]*매칭a또는 범위 내의 여러 문자 z(실제문자는 현재 로케일에 따라 다릅니다). 문자열의 시작 부분에는 이러한 문자가 0개 있고 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)

답변2

*일치하기 때문에0 이상이전 원자가 반복되고 모든 정규식 엔진은 첫 번째 일치 항목을 찾으려고 시도합니다. 문자열의 시작 부분에는 문자가 정확히 0개인 하위 문자열이 있으므로 이것이 일치합니다. 문자열이 문자로 시작하는 경우 *가능한 한 많은 일치 항목이 일치하지만 이는 가장 왼쪽 일치 항목을 찾는 데 부차적입니다.

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

재미로 다음을 시도해 보세요.

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

관련 정보