我写了一个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"
)
我的正则表达式出了什么问题?
谢谢!
答案 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