【问题标题】:What's wrong with my sed regex我的 sed 正则表达式有什么问题
【发布时间】:2013-04-11 08:18:07
【问题描述】:

我有一个 sed 命令来替换格式中的 json 键值对

"XXXXX" : "YYYYY"  

"XXXXX" : YYYYY  

这是我的 sed 命令,

sed -i  's/\("$\$XXXX\$\$\"\s*:\s*\"\)[^\"]*/\1YYYY/'

现在我想修改上面的正则表达式来更新键值对。

例子:

"XXXXX" : "YYYYY" 

应该更新为

"XXXXX" : "ZZZZZ"

"XXXXX" : YYYYY

应该更新为

"XXXXX" : ZZZZZ

注意区别,如果值是带引号的,值应该用引号更新,而它的值没有引号,它也应该更新它

这是我想出的 sed 命令,但它不起作用。

sed -i  's/\("$\$"qc.testset.ids"\$\$\"\s*:\s*"*\)[^\"]*/\1123123"*/'

我在这里错过了什么?如何让我的正则表达式同时支持这两种格式?

【问题讨论】:

  • 所以你想从"XXXXX" : "YYYYY"传递到"XXXXX" : YYYYY
  • @fedorqui 删除了我描述中的歧义。基本上,我希望我的正则表达式以"XXXXX" : "YYYYY""XXXXX" : YYYYY 两种格式更新密钥。
  • 对。我做了一些更新以使其更清晰。无论如何,您能否显示所需的输出以使其更容易理解?

标签: json unix sed


【解决方案1】:

使用可选的捕获组:

$ cat file
"XXXXX" : "YYYYY"
"XXXXX" : YYYYY
"XXXXX" : "YYYYY",  
"XXXXX" : YYYYY,

$ sed -r 's/^("XXXXX" : )(")?[^",]*(")?/\1\2ZZZZZ\3/' file
"XXXXX" : "ZZZZZ"
"XXXXX" : ZZZZZ
"XXXXX" : "ZZZZZ",  
"XXXXX" : ZZZZZ,

【讨论】:

  • 感谢您的解决方案。它工作正常,但如果键值对的格式为"XXXXX" : "YYYYY",,它会更新为"XXXXX" : "ZZZZZ",,但"XXXXX" : YYYYY, 会更新为"XXXXX" : ZZZZZ。请注意缺少逗号。我试图编辑你的正则表达式,但不能让它工作,你能看一下吗? sed -r 's/^("XXXXX"\s*:\s*)(")?[^"]*(")?(,)?/\1\2NEW_VALUE\3\4/'
  • 这从来都不是一个规范,所以它当然不会按预期工作,幸运的是修复是微不足道的。您应该从一开始就明确提出您的问题并具有代表性。
  • 非常感谢 :) 在短短一个小时内得到了答案,我为此挖掘了一天多!
  • 没问题,如果您从一开始就发布了输入示例和预期输出,您将在不到 10 分钟内得到答案,请确保您发布明确的问题并阅读FAQ
【解决方案2】:

这个 sed 也可以工作:

sed '/^"XXXXX"/{s/YYYYY/ZZZZZ/}' file

【讨论】:

    猜你喜欢
    • 2012-08-23
    • 2013-09-13
    • 2016-11-02
    • 1970-01-01
    • 2012-02-24
    相关资源
    最近更新 更多