我正在尝试"},"
用"}"
文件最后一行替换:
我的/etc/firefox/policies/policies.json
文件像这样,因为我使用循环添加了证书行for
:
$ cat /etc/firefox/policies/policies.json
{
"policies": {
"Certificates": {
"Install": [
{"cert1.der", "/home/username/cert1.pem"},
{"cert2.der", "/home/username/cert2.pem"},
$
"\n"
请注意,此文件末尾还没有。在将其添加到我的 JSON 文件末尾之前:
]
}
}
}
,
例如,我怎样才能删除最后一个:用“}”替换“},”?
sed
似乎是一个复杂的解决方案,是否有使用awk
或更易读的解决方案perl
?
要从文件路径名列表生成给定的 JSON
.pem
,您可以使用jq
及其reduce()
功能来构建数组:给定命令末尾的路径名(可以是某些文件名通配符模式的扩展,例如
~username/*.pem
),将路径名列表 ($ARGS.positional
) 逐一添加到数组中Install
。我们还删除.pem
文件名后缀和目录路径以创建相应的.der
字符串。上述命令将生成以下 JSON:
(请注意,
{"cert1.der","/home/username/cert1.pem"}
是有效的 JSON,但相当于{"cert1.der":null,"/home/username/cert1.pem":null}
,这不太可能是您想要的。)如果您想将其添加到已经存在的 JSON 文档中,则只需在调用
{}
中替换并将文件名传递给选项之前的命令或命令的标准输入流:reduce()
input
jq
--args
通过重定向在标准输入上提供现有的 JSON 文档:
jq
或者在命令行上传递文件的名称:实际上,我认为 sed 是实现这一目标最简单的工具,因为在 sed 中,您在处理最后一行时就知道它已经是最后一行了。据我所知,在 awk 和 Perl 中情况没那么简单,您先处理该行,然后跳转到块
END
。这意味着您需要手动缓冲一行...但在 sed 中,它只是这样:
尽管您可能只想在行尾进行更改,但以防中间还有另一次更改:
使用任何 awk 并且每次仅在内存中存储 2 行:
或者使用 GNU awk 进行多字符处理
RS
并一次将整个文件读入内存: