使用RipGrep和Sed通过搜索和替换附加到JSON文件

owfi6suc  于 2023-05-08  发布在  其他
关注(0)|答案(2)|浏览(134)

这不是真的附加什么,我正在寻找,但因为我有未来的菜鸟在脑海中,我采取了包括它在标题的自由。
我正在寻找/捕获一行结束"]在下一行(文件结束)在json文件(其中许多)。我在ripgrep中使用了多行选项,并转发了要用sed替换的结果列表。运行一个不带-l的sole rg,可以毫无问题地列出结果。问题出在sed部分。

cd path/to/folder
rg -l --multiline '(")(\n\])' regex/to/path/to/folders/settings.json | xargs sed -i 's/\("\)\(\n\]\)/\1,\nInputString\n\2/' *.json
  • 我在多个文件夹中递归搜索(regex是正确的,因为我用它来替换其他文件夹,包括git)。

我想要的是在没有逗号的行后面放一个逗号(在末尾有捕获的引号),放一个新行,放一个字符串(我会自己处理空格和引号),另一个新行和一个]来关闭json设置文件。
样品:

[
  "data1",
  "data2",
  "data(n)"
]

预期结果:

[
  "data1",
  "data2",
  "data(n)",
  "inputstring"
]

不管我怎么努力,都没成功。最后的*.json可能是多余的,就像rg命令部分的括号一样。但这些都不是问题所在。有什么问题吗?我是否缺少sed选项/标志?是否有需要转义的字符?也许是替换中的组的语法?
干杯

根据以下答案解决。

无法使用sponge命令,正在使用find(它足够快):

find path/to/folder -type f -name "settings.json" -exec sh -c 'jq --argjson s "[\"inputstring\"]" ". += \$s" "{}" | cat > tmp && mv tmp "{}"' \;
t9eec4r0

t9eec4r01#

使用适当的工具:jq

jq '[ .[], "inputstring" ]' file
[
  "data1",
  "data2",
  "data(n)",
  "inputstring"
]

要就地编辑 *,请执行以下操作:

jq '[ .[], "inputstring" ]' file | sponge file
omqzjyyz

omqzjyyz2#

您可以使用+=来更新数组。另外,使用--arg从jq外部导入字符串。

jq --arg s 'inputstring' '. += [$s]' file.json
[
  "data1",
  "data2",
  "data(n)",
  "inputstring"
]

相关问题