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

agxfikkp  于 2023-01-05  发布在  Unix
关注(0)|答案(3)|浏览(167)

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

有人能帮我吗?

bqucvtff

bqucvtff1#

A纯溶液

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

如果要保留包含的"字符,请忽略-r
注:peak's helpful answer包含一个 generalized 正则表达式,它通过Unicode category specifier\p{Cc}匹配ASCII和Latin-1 Unicode范围内的 * 所有 * 控制字符。jq使用Oniguruma regex引擎。
其他解决方案,使用附加实用程序,如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将其作为常量移除。

rdrgkggo

rdrgkggo2#

你的输入,下面的咒语:

$ 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/1walk/1遍历输入JSON)。
  • 您可能希望使用不同的字符类,或者指定gsub/2调用的管道。
  • 如果您只是想删除控制字符,请指定""作为gsub/2的第二个参数。

如果你确实想使用walk/1,但是你的jq没有它,那么在调用它之前简单地添加它的定义(很容易在web上获得,比如here)。

nwlls2ji

nwlls2ji3#

使用jqv1.6可以实现以下功能

jq -rc ".content.message" file.json

相关问题