따라서 명령은 다음과 같습니다.
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" 명령을 실행하세요.