1

我已经编写了一个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":)

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

谢谢!

4

3 回答 3

1

由于您不担心要替换的值,因此更简单的模式就足够了

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

或者您可以分别对待引用和未引用的

 sed -r 's/("XXXX"\s*:\s*)((")[^"]*"|[^,]*)/\1\3YYYY\3/' input
于 2013-04-22T08:10:28.003 回答
1

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

*一个想法是用+需要一个身体来代替身体。您可能还想将表达式与绑定^$因此您知道匹配整行以避免这样的混淆。

于 2013-04-22T08:01:00.173 回答
1

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

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

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

于 2013-04-22T08:01:23.837 回答