从JSON文件中删除转义序列字符,如换行符,制表符和回车符

时间:2016-10-29 16:10:53

标签: json shell unix jq control-characters

我有一个包含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"}
}

有人可以帮我吗?

2 个答案:

答案 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正则表达式引擎。

其他解决方案使用其他实用程序,例如sedtr

使用sed无条件删除转义序列\nt

$ 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调用的管道。
  • 如果您只想删除控制字符,请指定&#34;&#34;作为gsub/2的第二个参数。

如果您确实想使用walk/1,但您的jq没有它,那么只需在调用之前添加其定义(在网络上很容易获得,例如here)。