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'