[0-9]*가 숫자 없이 어디에나 일치하는 이유는 무엇입니까?

[0-9]*가 숫자 없이 어디에나 일치하는 이유는 무엇입니까?

따라서 명령은 다음과 같습니다.

echo "abc 123" | sed "s/[0-9]*/h/g"

내가 얻는 결과는 다음과 같습니다.

hahbhch h

이 출력을 어떻게 얻나요?

내가 원하는 출력은 abc h입니다.

이 명령으로 얻는 것은 다음과 같습니다.

echo "abc 123" | sed "s/[0-9][0-9]*/h/g"

누군가 이것을 설명해 줄 수 있습니까?

답변1

이는 *0개 이상의 일치 항목을 가능한 한 빨리 의미합니다. g플래그 없이 명령을 실행 하면 (즉 sed, 첫 번째 대체 후에 중지됨을 의미함) 출력을 얻게 됩니다 habc 123. 왼쪽에서 오른쪽으로 읽기 시작하는데 일치하지 않기 때문에 a줄의 시작 부분에만 일치하고 거기서 멈추기 때문입니다.

global( g) 플래그를 사용하면 문자열의 나머지 부분과 일치하려고 계속 시도하며, *다른 것과 일치할 수 없는 경우 빈 문자열과 일치하므로 h더 많은 숫자와 일치할 수 없을 때마다 하나씩 배치됩니다.

두 번째 시도는 다음 과 같습니다 sed "s/[0-9]\+/h/".+하나이상 일치합니다. 즉, 대체할 숫자를 찾을 수 없으면 빈 문자열과 일치하지 않습니다.

답변2

대답은 sed에서 정규식이 처리되는 방식과 관련이 있습니다. 정규식 또는 RE는 매우 복잡해질 수 있으며 이를 사용하는 기능과 구문의 복잡성 사이에는 균형이 있습니다. 다양한 프로그래밍 언어는 지원하려는 기능과 복잡성에 대해 서로 다른 선택을 합니다. Sed는 매우 강력해서 생각보다 조금 더 복잡합니다. 답을 얻으려면 *는 이전 토큰의 0개 이상의 인스턴스 시퀀스와 일치합니다. 귀하의 경우 이전 토큰은 임의의 숫자를 의미하는 [0-9]입니다. Sed는 입력 문자열의 각 문자 앞뒤에 길이가 0인 숫자 문자열이 오는 것을 확인합니다. 익숙해지기 전까지는 다소 반직관적인 것처럼 보입니다. 이 문제를 해결하는 일반적인 방법은 /[0-9][0-9]*/ 를 사용하는 것입니다. 이는 숫자 뒤에 0개 이상의 숫자가 오는 것으로 해석됩니다. 또 다른 해결책은 *를 +로 바꾸는 것입니다. + 하나 이상의 이전 토큰 시퀀스와 일치합니다. 따라서 완전한 명령은 다음과 같습니다.

echo "abc 123" | sed "s/[0-9]+/h/g"

온라인 매뉴얼(google man sed만 사용)을 사용하여 sed 명령에 대해 읽을 수 있습니다. 또는 시스템에 매뉴얼이 설치되어 있는 경우 "man sed" 명령을 실행하세요.

관련 정보