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


9

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/'지만 ( 대신 사용) 왜 작동하는지 이해하지 못합니다.

도울 수 있니?



@ Kamaraj, 그 유사하지만 쉘 패턴 대 정규식 혼란이 상단에 있습니다 (그리고 대답은 전자에 집중되어 ls foo*있습니다. 그러나 어쨌든 중복 된 질문을 찾으면 그와 같이 표시 할 수 있어야한다고 생각합니다.
ilkkachu

실시간 영상 및 설명에 대한 regexr.com 을 확인하십시오
RozzA

@RozzA 연결하는 웹 사이트는 POSIX 정규식이 아닌 Javascript 및 Perl 정규식을 지원합니다.
Kusalananda

답변:


28

패턴이 [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)

7
둘 이상의 문자로 만들 수있는 조합 요소 를 기술적으로 [a-z]일치 시킵니다. 예를 들어, 일부 헝가리어 로켈 에서[a-z]dzs
Stéphane Chazelas가

12

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

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

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

echo 'less than 123 words' | sed 's/[0-9]*/x/g'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.