命令行找到一行并添加“其余文本之前和之后

时间:2013-12-10 23:32:46

标签: jquery json parsing replace sed

我有一个像这样的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选项来完成这项工作,如果你对此有任何想法,也请随意。谢谢,

2 个答案:

答案 0 :(得分:2)

这样的事情可以做到:

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",
         }
      },
   ]
}

答案 1 :(得分:1)

perl -p -e 's/ : ([^"]+),/ : "$1",/;' < json.test