sed s / REGEXP / REPLACEMENT / g의 실행주기


14

echo ,,, |sed s':\(,\)\(,\):\1*\2:'g" ,*,,"가 아닌 " ,*,*," 가 산출 됩니까? 다시 말해, 왜 "g"플래그에도 불구하고 sed *는 한 쌍의 쉼표 사이에 ' '를 삽입하지 않습니까?

답변:


14

두에 있기 때문에 ,에서의 (,\)\(,\)이미 처음 두 일치 한 ,들과 정규식 패턴이 지금까지 일치하지 철수 라인의 나머지 부분에 대한 것입니다. 이제 마지막 하나만 남았 ,으므로 *마지막 두 번째 사이에 아무 것도없이 그대로 인쇄되었습니다 .

다른 ,입력 이 있으면 원하는 (전역, g) 응답을 얻습니다 .

% echo ,,,, | sed s':\(,\)\(,\):\1*\2:'g
,*,,*,

이상한 인용은 무엇입니까? (왜 휴가 sg인용 부호 중?)
한나라당

@GnP Haha는 OP에서 상속되었습니다.
heemayl

또는echo ,,,,, |sed s':\(,\)\(,\):\1*:’g
njboot

8

질문의 이유는 이미 @heemayl 의해 답변 되었습니다.

해결 방법 sed(여기서는 GNU라고 가정 sed)-일치하는 것이 발견되는 한 재귀 적으로 루프

$ echo ,,, | sed -E ':a s/(,)(,)/\1*\2/ ; ta'
,*,*,

$ echo ,,,, | sed -E ':a s/(,)(,)/\1*\2/ ; ta'
,*,*,*,

POSIXly :

$ echo ,,,, | sed -e :a -e 's/\(,\)\(,\)/\1*\2/; ta'
,*,*,*,

또는 perl

$ echo ,,, | perl -pe 's/,\K(?=,)/*/g'
,*,*,

$ echo ,,,, | perl -pe 's/,\K(?=,)/*/g'
,*,*,*,
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.