使用SED替换字符串不起作用

时间:2012-02-08 10:06:37

标签: bash sed

考虑这一行:

--dump-config=h264_sss-l2-2-ghb-16-500.ini --stats-file=h264_sss-l2-2-ghb-16-500.stat configs/example/cmp.py --l2cache -b h264_sss

和这个字符串“l2-2-ghb-16”。要使用SED更改该字符串,我运行了以下命令:

sed  's/l2-.*-.*-.*-/l2-2-ghb-8-m-/g'

但整条线路改为

--dump-config=h264_sss-l2-2-ghb-8-m-b h264_sss

问题是什么

3 个答案:

答案 0 :(得分:4)

.*部分匹配可以使模式工作的最长字符。因此,第一个.*与您希望的2不匹配,但是2-ghb-16-500.ini --stats-file=h264_sss-l2-2-ghb-16,依此类推。要使其工作,请用[^-](任何非破折号字符)替换点。所以,

sed  's/l2-[^-]*-[^-]*-[^-]*-/l2-2-ghb-8-m-/g'

答案 1 :(得分:2)

正则表达式贪婪因为.*将匹配最大个字符数。

这意味着它会尝试将匹配从您认为的第一种模式延伸到您认为的第二种模式。

虽然您可能认为有两种匹配的模式,但这种拉伸发生的事实意味着只有一种,而且它比您想象的要长。

快速解决方法是确保它与下一个-字符不匹配,例如:

sed  's/l2-[^-]*-[^-]*-[^-]*-/l2-2-ghb-8-m-/g'

根据以下成绩单:

pax> echo '--dump-config=h264_sss-l2-2-ghb-16-500.ini  --stats-file=h264_sss-l2-2-ghb-16-500.stat  configs/example/cmp.py --l2cache -b h264_sss' | sed 's/l2-[^-]*-[^-]*-[^-]*-/l2-2-ghb-8-m-/g'
           --dump-config=h264_sss-l2-2-ghb-8-m-500.ini --stats-file=h264_sss-l2-2-ghb-8-m-500.stat configs/example/cmp.py --l2cache -b h264_sss

(命令和输出略有修改,排成一行,以便您可以轻松查看转换)。

这是有效的,因为虽然.*表示任何字符的最大字段,[^-]*表示 -以外的任何字符的最大字段。

答案 2 :(得分:0)

sed寻找最可能的匹配。因此-.*-将匹配尽可能大的字符串。