从 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正则表达式引擎。
其他解决方案,使用额外的实用程序,例如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/"\(.*\)"//'
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
.
我有一个包含 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
。
注:\p{Cc}
. jq
uses the 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/"\(.*\)"//'
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
.