在bash GNU sed中用捕获组替换捕获匹配

时间:2017-11-14 09:25:25

标签: sed

我在下面列出的其他帖子中找了解我的问题的解决方案,但看起来我的正则表达式不同,需要特别小心: How to output only captured groups with sed Replace one capture group with another with GNU sed (macOS) 4.4 sed replace line with capture groups

我正在尝试替换大JSON文件中的正则表达式匹配组, 我的文件有mongoDB导出的对象,我正在尝试用string:

替换objectId
{"_id":{"$oid":"56cad2ce0481320c111d2313"},"recordId":{"$oid":"56cad2ce0481320c111d2313"}}

因此原始文件中的输出应如下所示:     { “_id”: “56cad2ce0481320c111d2313”, “的recordId”: “56cad2ce0481320c111d2313”}

这是我在shell中运行的命令:

sed -i 's/(?:{"\$oid":)("\w+")}/\$1/g' data.json

我没有收到错误,但文件保持不变。 我究竟做错了什么?

1 个答案:

答案 0 :(得分:0)

最后我设法让它工作,正则表达式在bash中的工作方式与regexr.com测试工具不同。

echo '{"$oid":"56cad2ce0481320c111d2313"}' | sed 's/{"$oid":\("\w*"\)}/\1/g'

给出正确的输出:

"56cad2ce0481320c111d2313"

我发现从stdin读取并输出到文件更好,而不是先写入JSON文件,然后再读取,替换和写入。

由于我使用mongoexport导出集合,替换objectId并将输出写入JSON文件,我的最终解决方案如下所示:

mongoexport --host localhost --db myDB --collection my_collection | sed 's/{"$oid":\\("\\w*"\\)}/\\1/g' >> data.json