왜 echo ,,, |sed s':\(,\)\(,\):\1*\2:'g
" ,*,,
"가 아닌 " ,*,*,
" 가 산출 됩니까? 다시 말해, 왜 "g"플래그에도 불구하고 sed *
는 한 쌍의 쉼표 사이에 ' '를 삽입하지 않습니까?
왜 echo ,,, |sed s':\(,\)\(,\):\1*\2:'g
" ,*,,
"가 아닌 " ,*,*,
" 가 산출 됩니까? 다시 말해, 왜 "g"플래그에도 불구하고 sed *
는 한 쌍의 쉼표 사이에 ' '를 삽입하지 않습니까?
답변:
두에 있기 때문에 ,
에서의 (,\)\(,\)
이미 처음 두 일치 한 ,
들과 정규식 패턴이 지금까지 일치하지 철수 라인의 나머지 부분에 대한 것입니다. 이제 마지막 하나만 남았 ,
으므로 *
마지막 두 번째 사이에 아무 것도없이 그대로 인쇄되었습니다 .
다른 ,
입력 이 있으면 원하는 (전역, g
) 응답을 얻습니다 .
% echo ,,,, | sed s':\(,\)\(,\):\1*\2:'g
,*,,*,
echo ,,,,, |sed s':\(,\)\(,\):\1*:’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'
,*,*,*,
s
및g
인용 부호 중?)