" " 대신 " echo ,,, |sed s':\(,\)\(,\):\1*\2:'g
"이 생성되는 이유는 무엇입니까 ? 즉, "g" 플래그에도 불구하고 sed가 쉼표 쌍 사이에 ' '를 삽입하지 않는 이유는 무엇입니까?,*,,
,*,*,
*
답변1
의 두 ,
s 에 대해 (,\)\(,\)
이미 처음 두 s를 일치시켰고 ,
지금까지 일치된 정규식 패턴이 나머지 줄을 역추적하지 않기 때문입니다. 이제 마지막 하나만 남았 으므로 중간에서 두 번째 항목 ,
없이 그대로 인쇄됩니다 .*
다른 입력이 있으면 원하는 (전역, ) 응답을 ,
얻게 됩니다 .g
% echo ,,,, | sed s':\(,\)\(,\):\1*\2:'g
,*,,*,
답변2
문제의 원인은 다음과 같습니다답변됨작성자: @heemayl
해결 방법 sed
(여기서 GNU 가정 sed
) - 일치하는 항목이 발견될 때마다 재귀적으로 루프합니다.
$ echo ,,, | sed -E ':a s/(,)(,)/\1*\2/ ; ta'
,*,*,
$ echo ,,,, | sed -E ':a s/(,)(,)/\1*\2/ ; ta'
,*,*,*,
POSIX적으로:
$ echo ,,,, | sed -e :a -e 's/\(,\)\(,\)/\1*\2/; ta'
,*,*,*,
또는perl
$ echo ,,, | perl -pe 's/,\K(?=,)/*/g'
,*,*,
$ echo ,,,, | perl -pe 's/,\K(?=,)/*/g'
,*,*,*,