我正在尝试从 JSON 文件中删除不同的值。这不太漂亮,jq 返回 1 个编译错误。我正在从命令行(awk/sed)寻找解决方案。
这是我的 json 文件中的示例数据(类似于 docker-compose):
aaaa"MyPorts":{"80/tcp":{},"8080/tcp":{},"9080/tcp":{},"9090/tcp":{}},aaaa
bbbb"PROTO 9080/tcp 9090/tcp"bbbbb
cccc"TEST PROTO 80 8080"ccccc
所有条目都可以多次找到,也可以在一行内找到。
使用替换后,它应该看起来像:
aaaaaaaa
bbbbbbbbb
cccc"TEST"ccccc
我尝试了 sed 和 (awk -F[\"]) 但无法获得一些有用的结果。如何做到这一点?
更新:我使示例更清晰..
有 3 种不同类型:...:
1: Delete from "MyPorts" to }},
2. Delete "Proto to \"
3. Delete from " PROTO" till one character before \", only if left from Proto is a space
更新 2:如果示例数据也在一行中,则如何完成此操作,如下所示:
aaaa"MyPorts":{"80/tcp":{},"8080/tcp":{},"9080/tcp":{},"9090/tcp":{}},aaaabbbb"PROTO 9080/tcp 9090/tcp"bbbbbcccc"TEST PROTO 80 8080"ccccc
使用替换后,它应该看起来像:
aaaaaaaabbbbbbbbbcccc"TEST"ccccc
答案1
sed
方法:
sed -E 's~("MyPorts.*\},|"PROTO[^"]+"| +PROTO[^"]+)~~' file
输出:
aaaaaaaa
bbbbbbbbb
cccc"TEST"ccccc
一行字符串输入的额外方法:
$ s='aaaa"MyPorts":{"80/tcp":{},"8080/tcp":{},"9080/tcp":{},"9090/tcp":{}},aaaabbbb"PROTO 9080/tcp 9090/tcp"bbbbbcccc"TES^CPROTO 80 8080"ccccc'
$ sed -En 's~("MyPorts.+\},|"PROTO[^"]+"| +PROTO[^"]+)~~gp' <<<"$s"
aaaaaaaabbbbbbbbbcccc"TEST"ccccc