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'
,*,*,*,

POSIXly:

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

或者与perl

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

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

相关内容