【问题标题】:Remove escape sequence characters like newline, tab and carriage return from JSON file从 JSON 文件中删除转义序列字符,如换行符、制表符和回车符
【发布时间】:2017-03-12 06:54:46
【问题描述】:

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

谁能帮我解决这个问题?

【问题讨论】:

  • 所以您从不想要该文件中的换行符或制表符字符?或者一个文件中有多个条目? (请更新您的Q,我将删除此评论)。祝你好运。
  • 如果您使用-r 选项,jq 会将转义序列转换为真正的换行符、制表符等。这是您想要的吗? jq -r .content.message file.json?
  • 不,我想删除换行符和制表符
  • 为清楚起见,请将与示例输入匹配的预期输出添加到您的问题中(剩下的一个歧义是您是否也希望去掉封闭的双引号)。

标签: json shell unix jq control-characters


【解决方案1】:

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

$ 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)。

【讨论】:

  • ++ 了解几种高级技术,但说实话,可以从您的答案中得出的简单jq -r '.content.message | gsub("[\\n\\t]"; "")' file.json 解决方案被附带/概括的信息所掩盖。跨度>
  • @mklement0 - (1) 问题包含短语“来自 JSON 文件”并提及大量字段。由于不清楚实际需要什么,我认为一个普遍有用的答案会更普遍有用:-))(2)问题通常提到“转义序列字符”,特别是TAB,NL和CR,而你提到的解决方案在这些 cmets 中并没有涵盖所有三个。
  • 公平点 - 描述本身经常存在歧义,并且描述与示例数据之间存在不一致(“换行符和制表符空格 [原文如此]”与“转义序列”一起提到)。我个人认为您的回答非常有用并从中吸取了教训,但我的观点是,具有更多上下文的“温和”框架可能会有所帮助。
【解决方案2】:

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 包含一个 通用 正则表达式,它通过 @987654322 匹配 ASCII 和 Latin-1 Unicode 范围内的 所有 控制字符@,\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 .

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 2017-12-11
    • 2015-09-28
    • 2011-06-15
    相关资源
    最近更新 更多