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


14

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

Answers:


14

因为有了,in中的两个(,\)\(,\),您已经匹配了前两个,s,并且到目前为止匹配的Regex模式不会在剩下的行中回溯。现在只剩下最后一个,,因此它按原样打印*,中间没有任何第二个。

如果您,输入了其他内容,则会得到所需的(全局g)响应:

% echo ,,,, | sed s':\(,\)\(,\):\1*\2:'g
,*,,*,

奇怪的报价是什么?(为什么要离开s,并g带引号的出来吗?)
国民生产总值的

@GnP哈哈,那是从OP继承的。
heemayl 2016年

echo ,,,,, |sed s':\(,\)\(,\):\1*:’g
njboot

8

@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'
,*,*,*,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.