Sed:正则表达式有什么问题

时间:2013-04-22 07:52:30

标签: regex sed

我写了一个sed正则表达式(主要是在SO的帮助下)来更新json文件中的值,该值可以是,

1 - "XXXX" : "YYYY"

2 - "XXXX" : "YYYY",

3 - "XXXX" : YYYY

4 - "XXXX" : YYYY,

5 - "XXXX" : "YYYY,ZZZZ"

这是我的sed正则表达式

sed -r 's/("XXXX"\s*:\s*)(")?[^",]*(")?/\1\2YYYY\3/'档案

上述表达式适用于1-4格式。

但对于5,它更新如下,

"XXXX" : "YYYY,ZZZZ""XXXX" : "ZZZZ,ZZZZ"(预计:"XXXX" : "ZZZZ"

我的正则表达式出了什么问题?

谢谢!

3 个答案:

答案 0 :(得分:1)

?表示0或1.您使用(")?来捕获可选引用。相反,在这种情况下,因为正文部分[^",]*无法匹配YYYY,ZZZZ正文和尾随引号根本不匹配(允许:由于*零正文,零报价到期到?)所以你的替换仅在行"XXXX" : "的第一部分上运行,其余部分不会被替换。

一个想法是用*替换身体+以要求身体。您可能还希望将表达式与^$绑定,以便您知道自己匹配整行,以避免出现这种混淆。

答案 1 :(得分:1)

这可能正在做你想做的事:

sed -r 's/("XXXX"\s*:\s*)(")?[^",]*[^"]*/\1\2YYYY/' input

但是,我不知道为什么yu期望"XXXX" : "ZZZZ"为最后一个,因为你的替换字符串中没有ZZZZ

答案 2 :(得分:1)

因为你不担心你要替换的价值不会更简单的模式

sed -r 's/("XXXX"\s*:\s*).*$/\1"YYYY",/' input

或者您可以单独处理引用的和未引用的

 sed -r 's/("XXXX"\s*:\s*)((")[^"]*"|[^,]*)/\1\3YYYY\3/' input