bourne shell上的字符串中的JSON斜杠和反斜杠

时间:2017-03-02 02:27:53

标签: json string escaping sh jq

我正在尝试解析包含某些字符串中的斜杠和反斜杠序列的json文件,如下所示:

echo '{"tag_string":"/\/\/\ test"}' | jq

给了我:

parse error: Invalid escape at line 1, column 27

我已尝试在不同位置使用反斜杠进行转义,但我似乎无法找到正确的方法。如何输出字符串,而不删除任何字符或出错?

这仅适用于bash,但不适用于sh(或zsh):

echo '{"tag_string":"/\\/\\/\\ test"}' | jq -r '.tag_string'
/\/\/\ test

3 个答案:

答案 0 :(得分:2)

正斜杠字符是合法的,但不是单个反斜杠字符。根据{{​​3}}字符描述,有效字符为:

char
    any-Unicode-character-
        except-"-or-\-or-
        control-character
    \"
    \\
    \/
    \b
    \f
    \n
    \r
    \t
    \u four-hex-digits 

所以在你的例子中,单个反斜杠是不合法的,你需要" \\"它被解释为双反斜杠,或者你需要完全删除它们。

答案 1 :(得分:0)

如果您尝试包含文字反斜杠:

(bash)的

echo '{"tag_string":"/\\/\\/\\ test"}' | jq
{
  "tag_string": "/\\/\\/\\ test"
}

echo '{"tag_string":"/\\/\\/\\ test"}' | jq -r '.["tag_string"]'
/\/\/\ test

(SH)

echo '{"tag_string":"/\\\\/\\\\/\\\\ test"}' | jq -r '.["tag_string"]'
/\/\/\ test

printf "%s" '{"tag_string":"/\\/\\/\\ test"}' | jq -r '.["tag_string"]'
/\/\/\ test

答案 2 :(得分:0)

如果您尝试使用非JSON字符串转换文件,请考虑使用any-json等工具。使用“cson-to-json”模式,“\ /”将被解释为“/”:

$ any-json -format=cson

输入:

{"tag_string":"/\/\/\ test"}

输出:

{
  "tag_string": "/// test"
}