【问题标题】:command line to find a line and add " before and after the rest of text命令行查找一行并在其余文本之前和之后添加“
【发布时间】:2013-12-28 17:51:21
【问题描述】:

我有一个这样的 JSON 文件:

{
   "User Entries" : [
      {
         "Names" : [
            "root",
            "BUILTIN\\Local System"
         ],
         "Libinfo" : {
               "pw_uuid" : FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000000,
               "pw_dir" : "/var/root",
               "pw_shell" : "/bin/sh",
               "pw_name" : "root",
            }
      },
      {
         "Names" : [
            "bob",
            "BUILTIN\\Local System"
         ],
         "Libinfo" : {
               "pw_uuid" : FFFFEEEE-DDDD-CCCC-BBBB-AAAA11111111,
               "pw_dir" : "/Users/bob",
               "pw_shell" : "/bin/sh",
               "pw_name" : "bob",
         }
      },
   ]
}

我想做的是,找到“pw_uuid”行并将“”添加到逗号之前的行的其余部分。例如, 原行:“pw_uuid”:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000000, 更改为:“pw_uuid”:“FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000000”,

有使用 sed 的感觉就可以了,你提出的任何命令都值得赞赏。

背景:因为使用jq命令,它报告数字无效(FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000000),实际上它们是字符串。我正在编写一个脚本来测试特定用户(上面的 bob)是否存在(如果存在),而不是提取用户信息,例如 pw_dir 和/或 pw_uuid 等。我正在研究 jq 选项来完成这项工作,如果您对此有任何想法,也请随意。谢谢,

【问题讨论】:

  • 你应该真正修复生成无效 JSON 的过程
  • @glenn-jackman,这个文件来自原生 OS X 命令,“odutil show cache”

标签: jquery json parsing replace sed


【解决方案1】:

这样的东西可以做到:

sed '/pw_uuid/s/"pw_uuid" : \([A-Z0-9-]*\)/"pw_uuid" : "\1"/g' file

或

sed '/pw_uuid/s/\(^[^:]*\): \([A-Z0-9-]*\)/\1: "\2"/g' file

所以/pw_uuid/ 过滤具有pw_uuid 的行。其中,它将块 "pw_uuid" : XXX 替换为 "pw_uuid" : "XXX"。

这是“捕获”"pw_uuid" 块和 XXX 块。 [A-Z0-90-]* 表示:一个大写字母、数字和- 的块。然后使用引用“捕获”块的\1、\2 将它们打印回来。


要使用内容更新文件,请将-i 添加到命令中,例如:

sed -i.bak '/pw_uuid/s/"pw_uuid" : \([A-Z0-9-]*\)/"pw_uuid" : "\1"/g' file
    ^^^^^^

或

sed -i.bak '/pw_uuid/s/\(^[^:]*\): \([A-Z0-9-]*\)/\1: "\2"/g' file
    ^^^^^^

命令的输出

{
   "User Entries" : [
      {
         "Names" : [
            "root",
            "BUILTIN\\Local System"
         ],
         "Libinfo" : {
               "pw_uuid" : "FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000000",
               "pw_dir" : "/var/root",
               "pw_shell" : "/bin/sh",
               "pw_name" : "root",
            }
      },
      {
         "Names" : [
            "bob",
            "BUILTIN\\Local System"
         ],
         "Libinfo" : {
               "pw_uuid" : "FFFFEEEE-DDDD-CCCC-BBBB-AAAA11111111",
               "pw_dir" : "/Users/bob",
               "pw_shell" : "/bin/sh",
               "pw_name" : "bob",
         }
      },
   ]
}

【讨论】:

  • Xanks,你得到的正是我想要的。
  • @user3085367 检查我更新的答案,我希望现在很清楚。
【解决方案2】:
perl -p -e 's/ : ([^"]+),/ : "$1",/;' < json.test

【讨论】:

  • 哇,这是最简单的答案……Xanks。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-07
  • 1970-01-01
相关资源
最近更新 更多