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'