sed s/REGEXP/REPLACEMENT/g的执行周期

use*_*179 14 sed regular-expression

为什么echo ,,, |sed s':\(,\)\(,\):\1*\2:'gyield " ,*,," 而不是 " ,*,*,"?换句话说:为什么尽管有“g”标志,sed 不会*在一对逗号之间插入 ' '?

hee*_*ayl 14

因为使用,s 中的两个s (,\)\(,\),您已经匹配了前两个,s 并且到目前为止匹配的 Regex 模式不会回溯该行的其余部分。现在只剩下最后一个,,因此它只是按原样打印,*在倒数第二个之间没有任何内容。

如果您有另一个,输入,您将获得所需的(全局,g)响应:

% echo ,,,, | sed s':\(,\)\(,\):\1*\2:'g
,*,,*,
Run Code Online (Sandbox Code Playgroud)


Sun*_*eep 8

@heemayl已经回答了这个问题的原因

解决方法sed(此处假设为 GNU sed) - 只要找到匹配项就递归循环

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

$ echo ,,,, | sed -E ':a s/(,)(,)/\1*\2/ ; ta'
,*,*,*,
Run Code Online (Sandbox Code Playgroud)

POSIXly:

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

或与 perl

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

$ echo ,,,, | perl -pe 's/,\K(?=,)/*/g'
,*,*,*,
Run Code Online (Sandbox Code Playgroud)