我有一个包含80多个字段的JSON。在使用jq提取下面提到的JSON文件中的消息字段时,我得到了换行符和制表符空格。我想删除转义序列字符,我已经尝试使用sed,但它没有用。
示例JSON文件:
{
"HOSTNAME":"server1.example",
"level":"WARN",
"level_value":30000,
"logger_name":"server1.example.adapter",
"content":{"message":"ERROR LALALLA\nERROR INFO NANANAN\tSOME MORE ERROR INFO\nBABABABABABBA\n BABABABA\t ABABBABAA\n\n BABABABAB\n\n"}
}
有人可以帮我吗?
答案 0 :(得分:5)
纯jq
解决方案:
$ jq -r '.content.message | gsub("[\\n\\t]"; "")' file.json
ERROR LALALLAERROR INFO NANANANSOME MORE ERROR INFOBABABABABABBA BABABABA ABABBABAA BABABABAB
如果您想保留令人着迷的"
个字符,请忽略-r
。
注意:peak's helpful answer包含通用正则表达式,该表达式通过以下方式匹配ASCII和Latin-1 Unicode范围内的所有控制字符Unicode category specifier,\p{Cc}
。 jq
使用Oniguruma正则表达式引擎。
其他解决方案使用其他实用程序,例如sed
和tr
。
使用sed
无条件删除转义序列\n
和t
:
$ jq '.content.message' file.json | sed 's/\\[tn]//g'
"ERROR LALALLAERROR INFO NANANANSOME MORE ERROR INFOBABABABABABBA BABABABA ABABBABAA BABABABAB"
请注意,封闭的"
仍在那里。
要删除它们,请在sed
命令中添加另一个替换:
$ jq '.content.message' file.json | sed 's/\\[tn]//g; s/"\(.*\)"/\1/'
ERROR LALALLAERROR INFO NANANANSOME MORE ERROR INFOBABABABABABBA BABABABA ABABBABAA BABABABAB
一个更简单的选项,也删除了封闭的"
(注意:输出没有尾随\n
):
$ jq -r '.content.message' file.json | tr -d '\n\t'
ERROR LALALLAERROR INFO NANANANSOME MORE ERROR INFOBABABABABABBA BABABABA ABABBABAA BABABABAB
请注意-r
如何使jq
插入字符串(展开\n
和\t
序列),然后将其删除 - 作为文字 - tr
。
答案 1 :(得分:4)
根据您的输入,以下咒语:
$ jq 'walk(if type == "string" then gsub("\\p{Cc}"; "<>") else . end)'
产生
{
"HOSTNAME": "server1.example",
"content": {
"message": "ERROR LALALLA<>ERROR INFO NANANAN<>SOME MORE ERROR INFO<>BABABABABABBA<> BABABABA<> ABABBABAA<><> BABABABAB<><>"
},
"level": "WARN",
"level_value": 30000,
"logger_name": "server1.example.adapter"
}
当然,上面的调用只是说明性的:
walk/1
。 (walk/1
遍历输入JSON。)gsub/2
调用的管道。gsub/2
的第二个参数。如果您确实想使用walk/1
,但您的jq没有它,那么只需在调用之前添加其定义(在网络上很容易获得,例如here)。