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