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

Remove escape sequence characters like newline, tab and carriage return from JSON file

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

谁能帮我解决这个问题?

根据您的输入,以下咒语:

$ 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。)
  • 您可能想要使用不同的字符 class,或指定 gsub/2 次调用的管道。
  • 如果您只想删除控制字符,请将“”指定为gsub/2的第二个参数。

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

一种jq溶液:

$ jq -r '.content.message | gsub("[\n\t]"; "")' file.json
ERROR LALALLAERROR INFO NANANANSOME MORE ERROR INFOBABABABABABBA BABABABA ABABBABAA BABABABAB

如果要保留 " 个字符,请省略 -r

注: contains a generalized regular expression that matches all control characters in the ASCII and Latin-1 Unicode range by way of a Unicode category specifier, \p{Cc}. jq uses the 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/"\(.*\)"//'
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.