我正在使用jq将bson文件解析为文本,反之亦然。在bash脚本中。
我在尝试逐行解析文本文件时遇到了这个问题,使其成为json对象。
这是我的输入文件:
default
———————————
out 0-65535 0.0.0.0/0 -1
in 80 0.0.0.0/0 tcp
in 8080 0.0.0.0/0 tcp
in 21017 192.168.1.0/32 tcp
in 2379 0.0.0.0/0 udp
in 0-65535 sg-10fa3c75 -1
===========
dev-external
———————————
out 0-65535 4.1.0.0/32 -1
in 1-2 sg-10fa3c75 -1
in 21034 sg-10fa3c75 tcp
in 9418 24.115.129.102/32 tcp
in 80 0.0.0.0/0 tcp
in 8080 default tcp
in 21017 192.168.1.0/0 tcp
in 123-655 1.45.9.1/32 -1
===========
my-sg
———————————
out 0-65535 0.0.0.0/0 -1
in 80 0.0.0.0/0 tcp
in 8070 0.0.0.0/0 tcp
in 8080 0.0.0.0/0 tcp
in 21017 192.168.1.0/32 tcp
in 0-65535 sg-10fa3c75 -1
===========
我尝试使用gawk解析此文件:
gawk 'BEGIN{RS="\n=+\n"; FS="\n"; ORS="\n"} { print $1 }'
返回:
default
dev-external
my-sg
但是当我使用jq解析它时:
| jq -R . | jq -s .
我附上了这些不需要的转义字符。
[
"\u001b[3g\r\u001bH \u001bH \u001bH \u001bH \u001bH \u001bH \u001bH \u001bH \u001bH \u001bH \u001bH \u001bH \u001bH \u001bH \u001bH \u001bH\rdefault",
"dev-external",
"my-sg"
]
请帮忙。 谢谢。
答案 0 :(得分:1)
从jq
manual page开始,其中一个选项似乎有所帮助:
- - color-output / -C和--monochrome-output / -M:
默认情况下,如果写入终端,jq会输出彩色JSON。您可以 即使使用写入管道或文件,也要强制它产生颜色 -C,并使用-M
禁用颜色
- - ascii-output / -a:
jq通常将非ASCII Unicode代码点输出为UTF-8,即使是 input将它们指定为转义序列(如“\ u03bc”)。用这个 选项,您可以强制jq生成每个纯ASCII输出 非ASCII字符替换为等效的转义序列。
(作为答案发布,即使它更多评论,因为它太长并且作为评论不可读 - 甚至可能是正确的......)
答案 1 :(得分:0)
令我感到困惑的是非ascii —
字符,但我能够在awk
& sed
将char复制/粘贴到以下内容中:
awk '/^—/ {d=1} /^=/ {d=0; next} !d'
sed '/^—/,/^=/ d'
结果如下:
$ awk '/^—/ {d=1} /^=/ {d=0; next} !d' esc.txt | jq -R . | jq -s
[
"default",
"dev-external",
"my-sg"
]
$ sed '/^—/,/^=/ d' esc.txt | jq -R . | jq -s
[
"default",
"dev-external",
"my-sg"
]
如果我们想让我们更明显地尝试匹配非ascii字符,我们可以利用awk
中的功能来匹配字符的八进制表示:
$ awk '/^\342\200\224/ {d=1} /^=/ {d=0; next} !d' esc.txt | jq -R . | jq -s
[
"default",
"dev-external",
"my-sg"
]
(使用 od
和“反复试验”找到的数字。)