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

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

" " 대신 " 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'
,*,*,*,

관련 정보