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)
@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)