sed s / REGEXP / REPLACEMENT / g의 실행주기 말해, 왜 “g”플래그에도 불구하고 sed *는 한

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



답변

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

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

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

답변

질문의 이유는 이미 @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'
,*,*,*,