]> granicus.if.org Git - jq/commitdiff
@tsv: escape \r, \n, \\
authorAssaf Gordon <assafgordon@gmail.com>
Wed, 15 Apr 2015 19:55:27 +0000 (15:55 -0400)
committerAssaf Gordon <assafgordon@gmail.com>
Wed, 15 Apr 2015 20:11:58 +0000 (16:11 -0400)
When using '@tsv' output format with '-r' option,
escape \r, \n and \\ in addition to \t.

Example:
    $ printf '{"id":"hello\\ttab\\nworld","x":43 }' | jq .
    {
      "id": "hello\ttab\nworld",
      "x": 43
    }

Before: newlines are not escaped, generating invalid TSV output:

    $ printf '{"id":"hello\\ttab\\nworld","x":43 }' \
        | ./jq-old -r '[.id,.x] | @tsv'
    hello\ttab
    world 43

After: newlines are properly escaped:

    $ printf '{"id":"hello\\ttab\\nworld","x":43 }' \
        | ./jq-new -r '[.id, .x] | @tsv'
    hello\ttab\nworld 43

Before: backslashes themselves are not escaped, so there's no way to
distinguish between escaped characters and 'real' backslashes
(in the example below, there is should not be newline, despite the
output containing "\n".

    $ printf '{"x":"hello\\ttab\\\\new world"}' \
        | ./jq-old -r '[.x]|@tsv'
    hello\ttab\new world

After: backslashes are escaped:

    $ printf '{"x":"hello\\ttab\\\\new world"}' \
        | ./jq-new -r '[.x]|@tsv'
    hello\ttab\\new world

builtin.c

index 7ef3cfa479160ab8e46177fc238ee6d297b24edd..16037983f6185385af2ae84e7f0ee4d73f63267a 100644 (file)
--- a/builtin.c
+++ b/builtin.c
@@ -383,7 +383,7 @@ static jv f_format(jq_state *jq, jv input, jv fmt) {
       assert(!strcmp(fmt_s, "tsv"));
       quotes = "";
       sep = "\t";
-      escapings = "\t\\t\0";
+      escapings = "\t\\t\0\r\\r\0\n\\n\0\\\\\\\0";
     }
     jv_free(fmt);
     if (jv_get_kind(input) != JV_KIND_ARRAY)