Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
JQ(1)									   JQ(1)

NAME
     jq - Command-line JSON processor

SYNOPSIS
     jq [options...] filter [files...]

     jq  can  transform  JSON in various ways, by selecting, iterating, reducing
     and otherwise mangling JSON documents. For instance, running the command jq
     'map(.price) | add' will take an array of JSON objects as input and  return
     the sum of their "price" fields.

     jq can accept text input as well, but by default, jq reads a stream of JSON
     entities  (including  numbers and other literals) from stdin. Whitespace is
     only needed to separate entities such as 1 and 2, and true and  false.  One
     or more files may be specified, in which case jq will read input from those
     instead.

     The options are described in the [INVOKING JQ] section; they mostly concern
     input  and  output formatting. The filter is written in the jq language and
     specifies how to transform the input file or document.

FILTERS
     A jq program is a "filter": it takes an  input,  and  produces  an  output.
     There  are a lot of builtin filters for extracting a particular field of an
     object, or converting a number to	a  string,  or	various  other	standard
     tasks.

     Filters  can  be  combined in various ways - you can pipe the output of one
     filter into another filter, or collect the output of a filter into  an  ar-
     ray.

     Some  filters  produce multiple results, for instance there's one that pro-
     duces all the elements of its input array. Piping that filter into a second
     runs the second filter for each element of  the  array.  Generally,  things
     that  would  be  done  with loops and iteration in other languages are just
     done by gluing filters together in jq.

     It's important to remember that every filter has an input	and  an  output.
     Even  literals  like "hello" or 42 are filters - they take an input but al-
     ways produce the same literal as output. Operations that combine  two  fil-
     ters,  like addition, generally feed the same input to both and combine the
     results. So, you can implement an averaging filter as add / length -  feed-
     ing  the  input array both to the add filter and the length filter and then
     performing the division.

     But that's getting ahead of ourselves. :) Let's start with  something  sim-
     pler:

INVOKING JQ
     jq filters run on a stream of JSON data. The input to jq is parsed as a se-
     quence  of  whitespace-separated  JSON  values which are passed through the
     provided filter one at a time. The output(s) of the filter are  written  to
     standard output, as a sequence of newline-separated JSON data.

     The  simplest  and  most  common  filter (or jq program) is ., which is the
     identity operator, copying the inputs of the jq  processor  to  the  output
     stream.  Because  the  default behavior of the jq processor is to read JSON
     texts from the input stream, and to pretty-print outputs, the  .  program's
     main  use	is  to	validate and pretty-print the inputs. The jq programming
     language is quite rich and allows for much more than  just  validation  and
     pretty-printing.

     Note:  it is important to mind the shell's quoting rules. As a general rule
     it's best to always quote (with single-quote characters on Unix shells) the
     jq program, as too many characters with special  meaning  to  jq  are  also
     shell  meta-characters. For example, jq "foo" will fail on most Unix shells
     because that will be the same as jq foo, which will generally fail  because
     foo  is  not  defined.  When using the Windows command shell (cmd.exe) it's
     best to use double quotes around your jq program when  given  on  the  com-
     mand-line	(instead  of the -f program-file option), but then double-quotes
     in the jq program need backslash escaping. When using the Powershell  (pow-
     ershell.exe) or the Powershell Core (pwsh/pwsh.exe), use single-quote char-
     acters  around  the jq program and backslash-escaped double-quotes (\") in-
     side the jq program.

     *	 Unix shells: jq '.["foo"]'

     *	 Powershell: jq '.[\"foo\"]'

     *	 Windows command shell: jq ".[\"foo\"]"

     Note: jq allows user-defined functions, but every jq program  must  have  a
     top-level expression.

     You can affect how jq reads and writes its input and output using some com-
     mand-line options:

     --null-input / -n:

	    Don't  read  any input at all. Instead, the filter is run once using
	    null as the input. This is useful when using jq as a simple calcula-
	    tor or to construct JSON data from scratch.

     --raw-input / -R:

	    Don't parse the input as JSON. Instead, each line of text is  passed
	    to the filter as a string. If combined with --slurp, then the entire
	    input is passed to the filter as a single long string.

     --slurp / -s:

	    Instead  of  running  the  filter for each JSON object in the input,
	    read the entire input stream into a large array and run  the  filter
	    just once.

     --compact-output / -c:

	    By default, jq pretty-prints JSON output. Using this option will re-
	    sult in more compact output by instead putting each JSON object on a
	    single line.

     --raw-output / -r:

	    With this option, if the filter's result is a string then it will be
	    written directly to standard output rather than being formatted as a
	    JSON  string  with	quotes. This can be useful for making jq filters
	    talk to non-JSON-based systems.

     --raw-output0:

	    Like -r but jq will print NUL instead of newline after each  output.
	    This  can  be  useful  when the values being output can contain new-
	    lines. When the output value contains NUL, jq  exits  with	non-zero
	    code.

     --join-output / -j:

	    Like -r but jq won't print a newline after each output.

     --ascii-output / -a:

	    jq	usually  outputs  non-ASCII Unicode codepoints as UTF-8, even if
	    the input specified them as escape sequences (like "\u03bc").  Using
	    this  option,  you	can  force  jq to produce pure ASCII output with
	    every non-ASCII character replaced with the  equivalent  escape  se-
	    quence.

     --sort-keys / -S:

	    Output the fields of each object with the keys in sorted order.

     --color-output / -C and --monochrome-output / -M:

	    By	default,  jq  outputs colored JSON if writing to a terminal. You
	    can force it to produce color even if writing to a pipe  or  a  file
	    using  -C,	and disable color with -M. When the NO_COLOR environment
	    variable is not empty, jq disables colored output  by  default,  but
	    you can enable it by -C.

	    Colors  can  be  configured  with the JQ_COLORS environment variable
	    (see below).

     --tab:

	    Use a tab for each indentation level instead of two spaces.

     --indent n:

	    Use the given number of spaces (no more than 7) for indentation.

     --unbuffered:

	    Flush the output after each JSON object is printed (useful if you're
	    piping a slow data source into jq and piping jq's output elsewhere).

     --stream:

	    Parse the input in streaming fashion, outputting arrays of path  and
	    leaf  values  (scalars and empty arrays or empty objects). For exam-
	    ple, "a" becomes  [[],"a"],  and  [[],"a",["b"]]  becomes  [[0],[]],
	    [[1],"a"], and [[2,0],"b"].

	    This  is  useful  for processing very large inputs. Use this in con-
	    junction with filtering and the reduce and foreach syntax to  reduce
	    large inputs incrementally.

     --stream-errors:

	    Like  --stream, but invalid JSON inputs yield array values where the
	    first element is the error and the second is a  path.  For	example,
	    ["a",n] produces ["Invalid literal at line 1, column 7",[1]].

	    Implies  --stream.	Invalid JSON inputs produce no error values when
	    --stream without --stream-errors.

     --seq:

	    Use the application/json-seq MIME type scheme  for	separating  JSON
	    texts  in jq's input and output. This means that an ASCII RS (record
	    separator) character is printed before each value on output  and  an
	    ASCII LF (line feed) is printed after every output. Input JSON texts
	    that  fail	to  parse are ignored (but warned about), discarding all
	    subsequent input until the next RS. This mode also parses the output
	    of jq without the --seq option.

     -f / --from-file:

	    Read the filter from a file rather than from a  command  line,  like
	    awk's  -f option. This changes the filter argument to be interpreted
	    as a filename, instead of the source of a program.

     -L directory / --library-path directory:

	    Prepend directory to the search list for modules. If this option  is
	    used then no builtin search list is used. See the section on modules
	    below.

     --arg name value:

	    This  option  passes a value to the jq program as a predefined vari-
	    able. If you run jq with --arg foo bar, then $foo  is  available  in
	    the program and has the value "bar". Note that value will be treated
	    as a string, so --arg foo 123 will bind $foo to "123".

	    Named arguments are also available to the jq program as $ARGS.named.
	    When the name is not a valid identifier, this is the only way to ac-
	    cess it.

     --argjson name JSON-text:

	    This  option passes a JSON-encoded value to the jq program as a pre-
	    defined variable. If you run jq with --argjson foo 123, then $foo is
	    available in the program and has the value 123.

     --slurpfile variable-name filename:

	    This option reads all the JSON texts in the named file and binds  an
	    array of the parsed JSON values to the given global variable. If you
	    run  jq with --slurpfile foo bar, then $foo is available in the pro-
	    gram and has an array whose elements correspond to the texts in  the
	    file named bar.

     --rawfile variable-name filename:

	    This  option  reads  in the named file and binds its contents to the
	    given global variable. If you run jq with --rawfile  foo  bar,  then
	    $foo is available in the program and has a string whose contents are
	    to the texts in the file named bar.

     --args:

	    Remaining  arguments  are  positional  string  arguments.  These are
	    available to the jq program as $ARGS.positional[].

     --jsonargs:

	    Remaining arguments are positional JSON text  arguments.  These  are
	    available to the jq program as $ARGS.positional[].

     --exit-status / -e:

	    Sets the exit status of jq to 0 if the last output value was neither
	    false nor null, 1 if the last output value was either false or null,
	    or	4 if no valid result was ever produced. Normally jq exits with 2
	    if there was any usage problem or system error, 3 if there was a  jq
	    program compile error, or 0 if the jq program ran.

	    Another  way  to  set the exit status is with the halt_error builtin
	    function.

     --binary / -b:

	    Windows users using WSL, MSYS2, or Cygwin, should  use  this  option
	    when  using  a  native jq.exe, otherwise jq will turn newlines (LFs)
	    into carriage-return-then-newline (CRLF).

     --version / -V:

	    Output the jq version and exit with zero.

     --build-configuration:

	    Output the build configuration of jq and exit with zero. This output
	    has no supported format or structure and may change  without  notice
	    in future releases.

     --help / -h:

	    Output the jq help and exit with zero.

     --:

	    Terminates	argument  processing. Remaining arguments are not inter-
	    preted as options.

     --run-tests [filename]:

	    Runs the tests in the given file or standard input. This must be the
	    last option given and does not honor all preceding options. The  in-
	    put  consists  of comment lines, empty lines, and program lines fol-
	    lowed by one input line, as many lines of  output  as  are	expected
	    (one  per output), and a terminating empty line. Compilation failure
	    tests start with a line containing only %%FAIL, then a line contain-
	    ing the program to compile, then a line containing an error  message
	    to compare to the actual.

	    Be warned that this option can change backwards-incompatibly.

BASIC FILTERS
   Identity: .
     The  absolute  simplest  filter is . . This filter takes its input and pro-
     duces the same value as output. That is, this is the identity operator.

     Since jq by default pretty-prints all output, a trivial program  consisting
     of nothing but . can be used to format JSON output from, say, curl.

     Although the identity filter never modifies the value of its input, jq pro-
     cessing  can sometimes make it appear as though it does. For example, using
     the current implementation of jq, we would see that the expression:

	 1E1234567890 | .

     produces 1.7976931348623157e+308 on at least one platform. This is because,
     in the process of parsing the number, this particular  version  of  jq  has
     converted	it  to an IEEE754 double-precision representation, losing preci-
     sion.

     The way in which jq handles numbers  has  changed	over  time  and  further
     changes  are  likely  within  the parameters set by the relevant JSON stan-
     dards. Moreover, build configuration options can  alter  how  jq  processes
     numbers.

     The  following  remarks  are  therefore offered with the understanding that
     they are intended to be descriptive of the current version of jq and should
     not be interpreted as being prescriptive:

     (1) Any arithmetic operation on a number that has	not  already  been  con-
     verted to an IEEE754 double precision representation will trigger a conver-
     sion to the IEEE754 representation.

     (2)  jq  will  attempt to maintain the original decimal precision of number
     literals (if the --disable-decnum build configuration option was not used),
     but in expressions such 1E1234567890, precision will be lost if  the  expo-
     nent is too large.

     (3) Comparisons are carried out using the untruncated big decimal represen-
     tation  of numbers if available, as illustrated in one of the following ex-
     amples.

     The examples below use the builtin function have_decnum in order to  demon-
     strate the expected effects of using / not using the --disable-decnum build
     configuration  option, and also to allow automated tests derived from these
     examples to pass regardless of whether that option is used.

	 jq '.'
	    "Hello, world!"
	 => "Hello, world!"

	 jq '.'
	    0.12345678901234567890123456789
	 => 0.12345678901234567890123456789

	 jq '[., tojson] == if have_decnum then [12345678909876543212345,"12345678909876543212345"] else [12345678909876543000000,"12345678909876543000000"] end'
	    12345678909876543212345
	 => true

	 jq '[1234567890987654321,-1234567890987654321 | tojson] == if have_decnum then ["1234567890987654321","-1234567890987654321"] else ["1234567890987654400","-1234567890987654400"] end'
	    null
	 => true

	 jq '. < 0.12345678901234567890123456788'
	    0.12345678901234567890123456789
	 => false

	 jq 'map([., . == 1]) | tojson == if have_decnum then "[[1,true],[1.000,true],[1.0,true],[1.00,true]]" else "[[1,true],[1,true],[1,true],[1,true]]" end'
	    [1, 1.000, 1.0, 100e-2]
	 => true

	 jq '. as $big | [$big, $big + 1] | map(. > 10000000000000000000000000000000) | . == if have_decnum then [true, false] else [false, false] end'
	    10000000000000000000000000000001
	 => true

   Object Identifier-Index: .foo, .foo.bar
     The simplest useful filter has the form .foo. When given a JSON object (aka
     dictionary or hash) as input, .foo produces the value at the key  "foo"  if
     the key is present, or null otherwise.

     A filter of the form .foo.bar is equivalent to .foo | .bar.

     The  .foo syntax only works for simple, identifier-like keys, that is, keys
     that are all made of alphanumeric characters and underscore, and  which  do
     not start with a digit.

     If  the key contains special characters or starts with a digit, you need to
     surround it with double quotes like this: ."foo$", or else .["foo$"].

     For example .["foo::bar"] and .["foo.bar"] work while .foo::bar does not.

	 jq '.foo'
	    {"foo": 42, "bar": "less interesting data"}
	 => 42

	 jq '.foo'
	    {"notfoo": true, "alsonotfoo": false}
	 => null

	 jq '.["foo"]'
	    {"foo": 42}
	 => 42

   Optional Object Identifier-Index: .foo?
     Just like .foo, but does not output an error when . is not an object.

	 jq '.foo?'
	    {"foo": 42, "bar": "less interesting data"}
	 => 42

	 jq '.foo?'
	    {"notfoo": true, "alsonotfoo": false}
	 => null

	 jq '.["foo"]?'
	    {"foo": 42}
	 => 42

	 jq '[.foo?]'
	    [1,2]
	 => []

   Object Index: .[<string>]
     You can also look up fields of an object using syntax like  .["foo"]  (.foo
     above  is	a  shorthand  version  of  this,  but  only  for identifier-like
     strings).

   Array Index: .[<number>]
     When the index value is an integer, .[<number>] can  index  arrays.  Arrays
     are zero-based, so .[2] returns the third element.

     Negative indices are allowed, with -1 referring to the last element, -2 re-
     ferring to the next to last element, and so on.

	 jq '.[0]'
	    [{"name":"JSON", "good":true}, {"name":"XML", "good":false}]
	 => {"name":"JSON", "good":true}

	 jq '.[2]'
	    [{"name":"JSON", "good":true}, {"name":"XML", "good":false}]
	 => null

	 jq '.[-2]'
	    [1,2,3]
	 => 2

   Array/String Slice: .[<number>:<number>]
     The  .[<number>:<number>] syntax can be used to return a subarray of an ar-
     ray or substring of a string. The array returned by  .[10:15]  will  be  of
     length  5,  containing  the  elements from index 10 (inclusive) to index 15
     (exclusive). Either index may be negative (in which case  it  counts  back-
     wards  from  the  end of the array), or omitted (in which case it refers to
     the start or end of the array). Indices are zero-based.

	 jq '.[2:4]'
	    ["a","b","c","d","e"]
	 => ["c", "d"]

	 jq '.[2:4]'
	    "abcdefghi"
	 => "cd"

	 jq '.[:3]'
	    ["a","b","c","d","e"]
	 => ["a", "b", "c"]

	 jq '.[-2:]'
	    ["a","b","c","d","e"]
	 => ["d", "e"]

   Array/Object Value Iterator: .[]
     If you use the .[index] syntax, but omit the index entirely, it will return
     all of the elements of an array. Running .[] with the  input  [1,2,3]  will
     produce  the numbers as three separate results, rather than as a single ar-
     ray. A filter of the form .foo[] is equivalent to .foo | .[].

     You can also use this on an object, and it will return all  the  values  of
     the object.

     Note that the iterator operator is a generator of values.

	 jq '.[]'
	    [{"name":"JSON", "good":true}, {"name":"XML", "good":false}]
	 => {"name":"JSON", "good":true}, {"name":"XML", "good":false}

	 jq '.[]'
	    []
	 =>

	 jq '.foo[]'
	    {"foo":[1,2,3]}
	 => 1, 2, 3

	 jq '.[]'
	    {"a": 1, "b": 1}
	 => 1, 1

   .[]?
     Like  .[],  but  no errors will be output if . is not an array or object. A
     filter of the form .foo[]? is equivalent to .foo | .[]?.

   Comma: ,
     If two filters are separated by a comma, then the same input  will  be  fed
     into both and the two filters' output value streams will be concatenated in
     order:  first, all of the outputs produced by the left expression, and then
     all of the outputs produced by the right. For instance, filter .foo,  .bar,
     produces both the "foo" fields and "bar" fields as separate outputs.

     The , operator is one way to construct generators.

	 jq '.foo, .bar'
	    {"foo": 42, "bar": "something else", "baz": true}
	 => 42, "something else"

	 jq '.user, .projects[]'
	    {"user":"stedolan", "projects": ["jq", "wikiflow"]}
	 => "stedolan", "jq", "wikiflow"

	 jq '.[4,2]'
	    ["a","b","c","d","e"]
	 => "e", "c"

   Pipe: |
     The  | operator combines two filters by feeding the output(s) of the one on
     the left into the input of the one on the right. It's similar to  the  Unix
     shell's pipe, if you're used to that.

     If the one on the left produces multiple results, the one on the right will
     be  run  for each of those results. So, the expression .[] | .foo retrieves
     the "foo" field of each element of the input array.  This	is  a  cartesian
     product, which can be surprising.

     Note that .a.b.c is the same as .a | .b | .c.

     Note too that . is the input value at the particular stage in a "pipeline",
     specifically:  where the . expression appears. Thus .a | . | .b is the same
     as .a.b, as the . in the middle refers to whatever value .a produced.

	 jq '.[] | .name'
	    [{"name":"JSON", "good":true}, {"name":"XML", "good":false}]
	 => "JSON", "XML"

   Parenthesis
     Parenthesis work as a grouping operator just as in any typical  programming
     language.

	 jq '(. + 2) * 5'
	    1
	 => 15

TYPES AND VALUES
     jq supports the same set of datatypes as JSON - numbers, strings, booleans,
     arrays, objects (which in JSON-speak are hashes with only string keys), and
     "null".

     Booleans,	null,  strings	and numbers are written the same way as in JSON.
     Just like everything else in jq, these simple values take an input and pro-
     duce an output - 42 is a valid jq expression that takes an  input,  ignores
     it, and returns 42 instead.

     Numbers  in jq are internally represented by their IEEE754 double precision
     approximation. Any arithmetic operation with numbers, whether they are lit-
     erals or results of previous  filters,  will  produce  a  double  precision
     floating point result.

     However,  when parsing a literal jq will store the original literal string.
     If no mutation is applied to this value then it will make to the output  in
     its original form, even if conversion to double would result in a loss.

   Array construction: []
     As  in JSON, [] is used to construct arrays, as in [1,2,3]. The elements of
     the arrays can be any jq expression, including a pipeline. All of	the  re-
     sults  produced by all of the expressions are collected into one big array.
     You can use it to construct an array out of a known quantity of values  (as
     in  [.foo, .bar, .baz]) or to "collect" all the results of a filter into an
     array (as in [.items[].name])

     Once you understand the "," operator, you can look at jq's array syntax  in
     a	different  light:  the expression [1,2,3] is not using a built-in syntax
     for comma-separated arrays, but is instead applying the []  operator  (col-
     lect  results)  to the expression 1,2,3 (which produces three different re-
     sults).

     If you have a filter X that produces four results, then the expression  [X]
     will produce a single result, an array of four elements.

	 jq '[.user, .projects[]]'
	    {"user":"stedolan", "projects": ["jq", "wikiflow"]}
	 => ["stedolan", "jq", "wikiflow"]

	 jq '[ .[] | . * 2]'
	    [1, 2, 3]
	 => [2, 4, 6]

   Object Construction: {}
     Like  JSON, {} is for constructing objects (aka dictionaries or hashes), as
     in: {"a": 42, "b": 17}.

     If the keys are "identifier-like", then the quotes can be left off,  as  in
     {a:42,  b:17}.  Variable references as key expressions use the value of the
     variable as the key. Key expressions other than constant literals,  identi-
     fiers,   or   variable   references,   need   to  be  parenthesized,  e.g.,
     {("a"+"b"):59}.

     The value can be any expression (although you may need to wrap it in paren-
     theses if, for example, it contains colons), which gets applied to  the  {}
     expression's input (remember, all filters have an input and an output).

	 {foo: .bar}

     will  produce  the  JSON  object  {"foo":	42}  if  given	the  JSON object
     {"bar":42, "baz":43} as its input. You can use this  to  select  particular
     fields  of an object: if the input is an object with "user", "title", "id",
     and "content" fields and you just want "user" and "title", you can write

	 {user: .user, title: .title}

     Because that is so common, there's a shortcut syntax for it: {user, title}.

     If one of the expressions produces multiple results, multiple  dictionaries
     will be produced. If the input's

	 {"user":"stedolan","titles":["JQ Primer", "More JQ"]}

     then the expression

	 {user, title: .titles[]}

     will produce two outputs:

	 {"user":"stedolan", "title": "JQ Primer"}
	 {"user":"stedolan", "title": "More JQ"}

     Putting parentheses around the key means it will be evaluated as an expres-
     sion. With the same input as above,

	 {(.user): .titles}

     produces

	 {"stedolan": ["JQ Primer", "More JQ"]}

     Variable references as keys use the value of the variable as the key. With-
     out  a value then the variable's name becomes the key and its value becomes
     the value,

	 "f o o" as $foo | "b a r" as $bar | {$foo, $bar:$foo}

     produces

	 {"foo":"f o o","b a r":"f o o"}

	 jq '{user, title: .titles[]}'
	    {"user":"stedolan","titles":["JQ Primer", "More JQ"]}
	 => {"user":"stedolan", "title": "JQ Primer"}, {"user":"stedolan", "title": "More JQ"}

	 jq '{(.user): .titles}'
	    {"user":"stedolan","titles":["JQ Primer", "More JQ"]}
	 => {"stedolan": ["JQ Primer", "More JQ"]}

   Recursive Descent: ..
     Recursively descends ., producing every value. This  is  the  same  as  the
     zero-argument recurse builtin (see below). This is intended to resemble the
     XPath // operator. Note that ..a does not work; use .. | .a instead. In the
     example  below we use .. | .a? to find all the values of object keys "a" in
     any object found "below" ..

     This is particularly useful in conjunction with path(EXP) (also see  below)
     and the ? operator.

	 jq '.. | .a?'
	    [[{"a":1}]]
	 => 1

BUILTIN OPERATORS AND FUNCTIONS
     Some  jq  operators  (for instance, +) do different things depending on the
     type of their arguments (arrays, numbers, etc.). However, jq never does im-
     plicit type conversions. If you try to add a string to an object you'll get
     an error message and no result.

     Please note that all numbers are  converted  to  IEEE754  double  precision
     floating point representation. Arithmetic and logical operators are working
     with  these converted doubles. Results of all such operations are also lim-
     ited to the double precision.

     The only exception to this behaviour of number is a  snapshot  of	original
     number literal. When a number which originally was provided as a literal is
     never mutated until the end of the program then it is printed to the output
     in  its  original	literal form. This also includes cases when the original
     literal would be truncated when converted to the IEEE754  double  precision
     floating point number.

   Addition: +
     The  operator + takes two filters, applies them both to the same input, and
     adds the results together. What "adding" means depends  on  the  types  in-
     volved:

     *	 Numbers are added by normal arithmetic.

     *	 Arrays are added by being concatenated into a larger array.

     *	 Strings are added by being joined into a larger string.

     *	 Objects  are  added  by  merging,  that is, inserting all the key-value
	 pairs from both objects into a single combined object. If both  objects
	 contain  a  value  for  the  same key, the object on the right of the +
	 wins. (For recursive merge use the * operator.)

     null can be added to any value, and returns the other value unchanged.

	 jq '.a + 1'
	    {"a": 7}
	 => 8

	 jq '.a + .b'
	    {"a": [1,2], "b": [3,4]}
	 => [1,2,3,4]

	 jq '.a + null'
	    {"a": 1}
	 => 1

	 jq '.a + 1'
	    {}
	 => 1

	 jq '{a: 1} + {b: 2} + {c: 3} + {a: 42}'
	    null
	 => {"a": 42, "b": 2, "c": 3}

   Subtraction: -
     As well as normal arithmetic subtraction on numbers, the - operator can  be
     used  on  arrays  to  remove all occurrences of the second array's elements
     from the first array.

	 jq '4 - .a'
	    {"a":3}
	 => 1

	 jq '. - ["xml", "yaml"]'
	    ["xml", "yaml", "json"]
	 => ["json"]

   Multiplication, division, modulo: *, /, %
     These infix operators behave as expected when given two  numbers.	Division
     by zero raises an error. x % y computes x modulo y.

     Multiplying  a string by a number produces the concatenation of that string
     that many times. "x" * 0 produces "".

     Dividing a string by another splits the first using the second  as  separa-
     tors.

     Multiplying  two objects will merge them recursively: this works like addi-
     tion but if both objects contain a value for the same key, and  the  values
     are objects, the two are merged with the same strategy.

	 jq '10 / . * 3'
	    5
	 => 6

	 jq '. / ", "'
	    "a, b,c,d, e"
	 => ["a","b,c,d","e"]

	 jq '{"k": {"a": 1, "b": 2}} * {"k": {"a": 0,"c": 3}}'
	    null
	 => {"k": {"a": 0, "b": 2, "c": 3}}

	 jq '.[] | (1 / .)?'
	    [1,0,-1]
	 => 1, -1

   abs
     The  builtin  function  abs is defined naively as: if . < 0 then - . else .
     end.

     For numeric input, this is the absolute value. See the section on the iden-
     tity filter for the implications of this definition for numeric input.

     To compute the absolute value of a number as a floating point  number,  you
     may wish use fabs.

	 jq 'map(abs)'
	    [-10, -1.1, -1e-1]
	 => [10,1.1,1e-1]

   length
     The  builtin  function length gets the length of various different types of
     value:

     *	 The length of a string is the number of Unicode codepoints it	contains
	 (which  will  be  the	same as its JSON-encoded length in bytes if it's
	 pure ASCII).

     *	 The length of a number is its absolute value.

     *	 The length of an array is the number of elements.

     *	 The length of an object is the number of key-value pairs.

     *	 The length of null is zero.

     *	 It is an error to use length on a boolean.

	 jq '.[] | length'
	    [[1,2], "string", {"a":2}, null, -5]
	 => 2, 6, 1, 0, 5

   utf8bytelength
     The builtin function utf8bytelength outputs the number of bytes used to en-
     code a string in UTF-8.

	 jq 'utf8bytelength'
	    "\u03bc"
	 => 2

   keys, keys_unsorted
     The builtin function keys, when given an object, returns its keys in an ar-
     ray.

     The keys are sorted "alphabetically", by unicode codepoint order.	This  is
     not  an  order  that makes particular sense in any particular language, but
     you can count on it being the same for any two objects with the same set of
     keys, regardless of locale settings.

     When keys is given an array, it returns the valid indices for  that  array:
     the integers from 0 to length-1.

     The keys_unsorted function is just like keys, but if the input is an object
     then  the	keys will not be sorted, instead the keys will roughly be in in-
     sertion order.

	 jq 'keys'
	    {"abc": 1, "abcd": 2, "Foo": 3}
	 => ["Foo", "abc", "abcd"]

	 jq 'keys'
	    [42,3,35]
	 => [0,1,2]

   has(key)
     The builtin function has returns whether the input  object  has  the  given
     key, or the input array has an element at the given index.

     has($key)	has  the same effect as checking whether $key is a member of the
     array returned by keys, although has will be faster.

	 jq 'map(has("foo"))'
	    [{"foo": 42}, {}]
	 => [true, false]

	 jq 'map(has(2))'
	    [[0,1], ["a","b","c"]]
	 => [false, true]

   in
     The builtin function in returns whether or not the  input	key  is  in  the
     given object, or the input index corresponds to an element in the given ar-
     ray. It is, essentially, an inversed version of has.

	 jq '.[] | in({"foo": 42})'
	    ["foo", "bar"]
	 => true, false

	 jq 'map(in([0,1]))'
	    [2, 0]
	 => [false, true]

   map(f), map_values(f)
     For any filter f, map(f) and map_values(f) apply f to each of the values in
     the input array or object, that is, to the values of .[].

     In  the  absence of errors, map(f) always outputs an array whereas map_val-
     ues(f) outputs an array if given an array, or an object if given an object.

     When the input to map_values(f) is an object, the	output	object	has  the
     same keys as the input object except for those keys whose values when piped
     to f produce no values at all.

     The key difference between map(f) and map_values(f) is that the former sim-
     ply forms an array from all the values of ($x|f) for each value, $x, in the
     input array or object, but map_values(f) only uses first($x|f).

     Specifically, for object inputs, map_values(f) constructs the output object
     by  examining  in turn the value of first(.[$k]|f) for each key, $k, of the
     input. If this expression produces no values, then  the  corresponding  key
     will  be  dropped; otherwise, the output object will have that value at the
     key, $k.

     Here are some examples to clarify the behavior of map and	map_values  when
     applied to arrays. These examples assume the input is [1] in all cases:

	 map(.+1)	   #=>	[2]
	 map(., .)	   #=>	[1,1]
	 map(empty)	   #=>	[]

	 map_values(.+1)   #=>	[2]
	 map_values(., .)  #=>	[1]
	 map_values(empty) #=>	[]

     map(f) is equivalent to [.[] | f] and map_values(f) is equivalent to .[] |=
     f.

     In fact, these are their implementations.

	 jq 'map(.+1)'
	    [1,2,3]
	 => [2,3,4]

	 jq 'map_values(.+1)'
	    {"a": 1, "b": 2, "c": 3}
	 => {"a": 2, "b": 3, "c": 4}

	 jq 'map(., .)'
	    [1,2]
	 => [1,1,2,2]

	 jq 'map_values(. // empty)'
	    {"a": null, "b": true, "c": false}
	 => {"b":true}

   pick(pathexps)
     Emit  the	projection of the input object or array defined by the specified
     sequence of path expressions, such that if p is any one of these specifica-
     tions, then (. | p) will evaluate to the same value as (. |  pick(pathexps)
     |	p). For arrays, negative indices and .[m:n] specifications should not be
     used.

	 jq 'pick(.a, .b.c, .x)'
	    {"a": 1, "b": {"c": 2, "d": 3}, "e": 4}
	 => {"a":1,"b":{"c":2},"x":null}

	 jq 'pick(.[2], .[0], .[0])'
	    [1,2,3,4]
	 => [1,null,3]

   path(path_expression)
     Outputs array representations of the given path expression in ..  The  out-
     puts are arrays of strings (object keys) and/or numbers (array indices).

     Path  expressions	are  jq expressions like .a, but also .[]. There are two
     types of path expressions: ones that can match exactly, and ones that  can-
     not. For example, .a.b.c is an exact match path expression, while .a[].b is
     not.

     path(exact_path_expression)  will	produce  the array representation of the
     path expression even if it does not exist in ., if . is null or an array or
     an object.

     path(pattern) will produce array representations of the paths matching pat-
     tern if the paths exist in ..

     Note that the path expressions are not different from  normal  expressions.
     The  expression  path(..|select(type=="boolean"))	outputs all the paths to
     boolean values in ., and only those paths.

	 jq 'path(.a[0].b)'
	    null
	 => ["a",0,"b"]

	 jq '[path(..)]'
	    {"a":[{"b":1}]}
	 => [[],["a"],["a",0],["a",0,"b"]]

   del(path_expression)
     The builtin function del removes a key and its corresponding value from  an
     object.

	 jq 'del(.foo)'
	    {"foo": 42, "bar": 9001, "baz": 42}
	 => {"bar": 9001, "baz": 42}

	 jq 'del(.[1, 2])'
	    ["foo", "bar", "baz"]
	 => ["foo"]

   getpath(PATHS)
     The  builtin function getpath outputs the values in . found at each path in
     PATHS.

	 jq 'getpath(["a","b"])'
	    null
	 => null

	 jq '[getpath(["a","b"], ["a","c"])]'
	    {"a":{"b":0, "c":1}}
	 => [0, 1]

   setpath(PATHS; VALUE)
     The builtin function setpath sets the PATHS in . to VALUE.

	 jq 'setpath(["a","b"]; 1)'
	    null
	 => {"a": {"b": 1}}

	 jq 'setpath(["a","b"]; 1)'
	    {"a":{"b":0}}
	 => {"a": {"b": 1}}

	 jq 'setpath([0,"a"]; 1)'
	    null
	 => [{"a":1}]

   delpaths(PATHS)
     The builtin function delpaths deletes the PATHS in .. PATHS must be an  ar-
     ray of paths, where each path is an array of strings and numbers.

	 jq 'delpaths([["a","b"]])'
	    {"a":{"b":1},"x":{"y":2}}
	 => {"a":{},"x":{"y":2}}

   to_entries, from_entries, with_entries(f)
     These  functions convert between an object and an array of key-value pairs.
     If to_entries is passed an object, then for each k: v entry in  the  input,
     the output array includes {"key": k, "value": v}.

     from_entries  does the opposite conversion, and with_entries(f) is a short-
     hand for to_entries | map(f) | from_entries, useful for doing  some  opera-
     tion  to  all  keys  and  values  of an object. from_entries accepts "key",
     "Key", "name", "Name", "value", and "Value" as keys.

	 jq 'to_entries'
	    {"a": 1, "b": 2}
	 => [{"key":"a", "value":1}, {"key":"b", "value":2}]

	 jq 'from_entries'
	    [{"key":"a", "value":1}, {"key":"b", "value":2}]
	 => {"a": 1, "b": 2}

	 jq 'with_entries(.key |= "KEY_" + .)'
	    {"a": 1, "b": 2}
	 => {"KEY_a": 1, "KEY_b": 2}

   select(boolean_expression)
     The function select(f) produces its input unchanged if f returns  true  for
     that input, and produces no output otherwise.

     It's  useful  for	filtering lists: [1,2,3] | map(select(. >= 2)) will give
     you [2,3].

	 jq 'map(select(. >= 2))'
	    [1,5,3,0,7]
	 => [5,3,7]

	 jq '.[] | select(.id == "second")'
	    [{"id": "first", "val": 1}, {"id": "second", "val": 2}]
	 => {"id": "second", "val": 2}

   arrays, objects, iterables, booleans,  numbers,  normals,  finites,	strings,
     nulls, values, scalars
     These built-ins select only inputs that are arrays, objects, iterables (ar-
     rays  or  objects),  booleans,  numbers,  normal  numbers,  finite numbers,
     strings, null, non-null values, and non-iterables, respectively.

	 jq '.[]|numbers'
	    [[],{},1,"foo",null,true,false]
	 => 1

   empty
     empty returns no results. None at all. Not even null.

     It's useful on occasion. You'll know if you need it :)

	 jq '1, empty, 2'
	    null
	 => 1, 2

	 jq '[1,2,empty,3]'
	    null
	 => [1,2,3]

   error, error(message)
     Produces an error with the input value, or with the message  given  as  the
     argument. Errors can be caught with try/catch; see below.

	 jq 'try error catch .'
	    "error message"
	 => "error message"

	 jq 'try error("invalid value: \(.)") catch .'
	    42
	 => "invalid value: 42"

   halt
     Stops the jq program with no further outputs. jq will exit with exit status
     0.

   halt_error, halt_error(exit_code)
     Stops  the jq program with no further outputs. The input will be printed on
     stderr as raw output (i.e., strings will not have double  quotes)	with  no
     decoration, not even a newline.

     The given exit_code (defaulting to 5) will be jq's exit status.

     For example, "Error: something went wrong\n"|halt_error(1).

   $__loc__
     Produces  an  object  with a "file" key and a "line" key, with the filename
     and line number where $__loc__ occurs, as values.

	 jq 'try error("\($__loc__)") catch .'
	    null
	 => "{\"file\":\"<top-level>\",\"line\":1}"

   paths, paths(node_filter)
     paths outputs the paths to all the elements in its input  (except	it  does
     not output the empty list, representing . itself).

     paths(f)  outputs	the  paths  to	any values for which f is true. That is,
     paths(type == "number") outputs the paths to all numeric values.

	 jq '[paths]'
	    [1,[[],{"a":2}]]
	 => [[0],[1],[1,0],[1,1],[1,1,"a"]]

	 jq '[paths(type == "number")]'
	    [1,[[],{"a":2}]]
	 => [[0],[1,1,"a"]]

   add, add(generator)
     The filter add takes as input an array, and produces as output the elements
     of the array added together. This might mean summed, concatenated or merged
     depending on the types of the elements of the input array - the  rules  are
     the same as those for the + operator (described above).

     If the input is an empty array, add returns null.

     add(generator) operates on the given generator rather than the input.

	 jq 'add'
	    ["a","b","c"]
	 => "abc"

	 jq 'add'
	    [1, 2, 3]
	 => 6

	 jq 'add'
	    []
	 => null

	 jq 'add(.[].a)'
	    [{"a":3}, {"a":5}, {"b":6}]
	 => 8

   any, any(condition), any(generator; condition)
     The filter any takes as input an array of boolean values, and produces true
     as output if any of the elements of the array are true.

     If the input is an empty array, any returns false.

     The  any(condition) form applies the given condition to the elements of the
     input array.

     The any(generator; condition) form applies the given condition to	all  the
     outputs of the given generator.

	 jq 'any'
	    [true, false]
	 => true

	 jq 'any'
	    [false, false]
	 => false

	 jq 'any'
	    []
	 => false

   all, all(condition), all(generator; condition)
     The filter all takes as input an array of boolean values, and produces true
     as output if all of the elements of the array are true.

     The  all(condition) form applies the given condition to the elements of the
     input array.

     The all(generator; condition) form applies the given condition to	all  the
     outputs of the given generator.

     If the input is an empty array, all returns true.

	 jq 'all'
	    [true, false]
	 => false

	 jq 'all'
	    [true, true]
	 => true

	 jq 'all'
	    []
	 => true

   flatten, flatten(depth)
     The filter flatten takes as input an array of nested arrays, and produces a
     flat  array  in which all arrays inside the original array have been recur-
     sively replaced by their values. You can pass an argument to it to  specify
     how many levels of nesting to flatten.

     flatten(2) is like flatten, but going only up to two levels deep.

	 jq 'flatten'
	    [1, [2], [[3]]]
	 => [1, 2, 3]

	 jq 'flatten(1)'
	    [1, [2], [[3]]]
	 => [1, 2, [3]]

	 jq 'flatten'
	    [[]]
	 => []

	 jq 'flatten'
	    [{"foo": "bar"}, [{"foo": "baz"}]]
	 => [{"foo": "bar"}, {"foo": "baz"}]

   range(upto), range(from; upto), range(from; upto; by)
     The  range  function  produces  a range of numbers. range(4; 10) produces 6
     numbers, from 4 (inclusive) to 10 (exclusive). The numbers are produced  as
     separate outputs. Use [range(4; 10)] to get a range as an array.

     The one argument form generates numbers from 0 to the given number, with an
     increment of 1.

     The two argument form generates numbers from from to upto with an increment
     of 1.

     The three argument form generates numbers from to upto with an increment of
     by.

	 jq 'range(2; 4)'
	    null
	 => 2, 3

	 jq '[range(2; 4)]'
	    null
	 => [2,3]

	 jq '[range(4)]'
	    null
	 => [0,1,2,3]

	 jq '[range(0; 10; 3)]'
	    null
	 => [0,3,6,9]

	 jq '[range(0; 10; -1)]'
	    null
	 => []

	 jq '[range(0; -5; -1)]'
	    null
	 => [0,-1,-2,-3,-4]

   floor
     The floor function returns the floor of its numeric input.

	 jq 'floor'
	    3.14159
	 => 3

   sqrt
     The sqrt function returns the square root of its numeric input.

	 jq 'sqrt'
	    9
	 => 3

   tonumber
     The  tonumber  function  parses its input as a number. It will convert cor-
     rectly-formatted strings to their numeric equivalent, leave numbers  alone,
     and give an error on all other input.

	 jq '.[] | tonumber'
	    [1, "1"]
	 => 1, 1

   toboolean
     The  toboolean function parses its input as a boolean. It will convert cor-
     rectly-formatted strings to their boolean equivalent, leave booleans alone,
     and give an error on all other input.

	 jq '.[] | toboolean'
	    ["true", "false", true, false]
	 => true, false, true, false

   tostring
     The tostring function prints its input as a string. Strings  are  left  un-
     changed, and all other values are JSON-encoded.

	 jq '.[] | tostring'
	    [1, "1", [1]]
	 => "1", "1", "[1]"

   type
     The  type	function  returns the type of its argument as a string, which is
     one of null, boolean, number, string, array or object.

	 jq 'map(type)'
	    [0, false, [], {}, null, "hello"]
	 => ["number", "boolean", "array", "object", "null", "string"]

   infinite, nan, isinfinite, isnan, isfinite, isnormal
     Some arithmetic operations can yield infinities and "not  a  number"  (NaN)
     values.  The  isinfinite builtin returns true if its input is infinite. The
     isnan builtin returns true if its input is a NaN. The infinite builtin  re-
     turns  a positive infinite value. The nan builtin returns a NaN. The isnor-
     mal builtin returns true if its input is a normal number.

     Note that division by zero raises an error.

     Currently most arithmetic operations operating  on  infinities,  NaNs,  and
     sub-normals do not raise errors.

	 jq '.[] | (infinite * .) < 0'
	    [-1, 1]
	 => true, false

	 jq 'infinite, nan | type'
	    null
	 => "number", "number"

   sort, sort_by(path_expression)
     The  sort	functions  sorts  its  input, which must be an array. Values are
     sorted in the following order:

     *	 null

     *	 false

     *	 true

     *	 numbers

     *	 strings, in alphabetical order (by unicode codepoint value)

     *	 arrays, in lexical order

     *	 objects

     The ordering for objects is a little complex:  first  they're  compared  by
     comparing their sets of keys (as arrays in sorted order), and if their keys
     are equal then the values are compared key by key.

     sort_by  may  be used to sort by a particular field of an object, or by ap-
     plying any jq filter. sort_by(f) compares two elements by comparing the re-
     sult of f on each element. When f produces multiple values, it firstly com-
     pares the first values, and the second  values  if  the  first  values  are
     equal, and so on.

	 jq 'sort'
	    [8,3,null,6]
	 => [null,3,6,8]

	 jq 'sort_by(.foo)'
	    [{"foo":4, "bar":10}, {"foo":3, "bar":10}, {"foo":2, "bar":1}]
	 => [{"foo":2, "bar":1}, {"foo":3, "bar":10}, {"foo":4, "bar":10}]

	 jq 'sort_by(.foo, .bar)'
	    [{"foo":4, "bar":10}, {"foo":3, "bar":20}, {"foo":2, "bar":1}, {"foo":3, "bar":10}]
	 => [{"foo":2, "bar":1}, {"foo":3, "bar":10}, {"foo":3, "bar":20}, {"foo":4, "bar":10}]

   group_by(path_expression)
     group_by(.foo) takes as input an array, groups the elements having the same
     .foo  field  into separate arrays, and produces all of these arrays as ele-
     ments of a larger array, sorted by the value of the .foo field.

     Any jq expression, not just a field access, may be used in place  of  .foo.
     The sorting order is the same as described in the sort function above.

	 jq 'group_by(.foo)'
	    [{"foo":1, "bar":10}, {"foo":3, "bar":100}, {"foo":1, "bar":1}]
	 => [[{"foo":1, "bar":10}, {"foo":1, "bar":1}], [{"foo":3, "bar":100}]]

   min, max, min_by(path_exp), max_by(path_exp)
     Find the minimum or maximum element of the input array.

     The  min_by(path_exp) and max_by(path_exp) functions allow you to specify a
     particular field or property to examine, e.g. min_by(.foo) finds the object
     with the smallest foo field.

	 jq 'min'
	    [5,4,2,7]
	 => 2

	 jq 'max_by(.foo)'
	    [{"foo":1, "bar":14}, {"foo":2, "bar":3}]
	 => {"foo":2, "bar":3}

   unique, unique_by(path_exp)
     The unique function takes as input an array and produces an  array  of  the
     same elements, in sorted order, with duplicates removed.

     The  unique_by(path_exp) function will keep only one element for each value
     obtained by applying the argument. Think of it as making an array by taking
     one element out of every group produced by group.

	 jq 'unique'
	    [1,2,5,3,5,3,1,3]
	 => [1,2,3,5]

	 jq 'unique_by(.foo)'
	    [{"foo": 1, "bar": 2}, {"foo": 1, "bar": 3}, {"foo": 4, "bar": 5}]
	 => [{"foo": 1, "bar": 2}, {"foo": 4, "bar": 5}]

	 jq 'unique_by(length)'
	    ["chunky", "bacon", "kitten", "cicada", "asparagus"]
	 => ["bacon", "chunky", "asparagus"]

   reverse
     This function reverses an array.

	 jq 'reverse'
	    [1,2,3,4]
	 => [4,3,2,1]

   contains(element)
     The filter contains(b) will produce  true	if  b  is  completely  contained
     within the input. A string B is contained in a string A if B is a substring
     of  A.  An array B is contained in an array A if all elements in B are con-
     tained in any element in A. An object B is contained in object A if all  of
     the  values  in  B  are  contained in the value in A with the same key. All
     other types are assumed to be contained in each other if they are equal.

	 jq 'contains("bar")'
	    "foobar"
	 => true

	 jq 'contains(["baz", "bar"])'
	    ["foobar", "foobaz", "blarp"]
	 => true

	 jq 'contains(["bazzzzz", "bar"])'
	    ["foobar", "foobaz", "blarp"]
	 => false

	 jq 'contains({foo: 12, bar: [{barp: 12}]})'
	    {"foo": 12, "bar":[1,2,{"barp":12, "blip":13}]}
	 => true

	 jq 'contains({foo: 12, bar: [{barp: 15}]})'
	    {"foo": 12, "bar":[1,2,{"barp":12, "blip":13}]}
	 => false

   indices(s)
     Outputs an array containing the indices in . where s occurs. The input  may
     be an array, in which case if s is an array then the indices output will be
     those where all elements in . match those of s.

	 jq 'indices(", ")'
	    "a,b, cd, efg, hijk"
	 => [3,7,12]

	 jq 'indices(1)'
	    [0,1,2,1,3,1,4]
	 => [1,3,5]

	 jq 'indices([1,2])'
	    [0,1,2,3,1,4,2,5,1,2,6,7]
	 => [1,8]

   index(s), rindex(s)
     Outputs  the index of the first (index) or last (rindex) occurrence of s in
     the input.

	 jq 'index(", ")'
	    "a,b, cd, efg, hijk"
	 => 3

	 jq 'index(1)'
	    [0,1,2,1,3,1,4]
	 => 1

	 jq 'index([1,2])'
	    [0,1,2,3,1,4,2,5,1,2,6,7]
	 => 1

	 jq 'rindex(", ")'
	    "a,b, cd, efg, hijk"
	 => 12

	 jq 'rindex(1)'
	    [0,1,2,1,3,1,4]
	 => 5

	 jq 'rindex([1,2])'
	    [0,1,2,3,1,4,2,5,1,2,6,7]
	 => 8

   inside
     The filter inside(b) will produce true if the input is completely contained
     within b. It is, essentially, an inversed version of contains.

	 jq 'inside("foobar")'
	    "bar"
	 => true

	 jq 'inside(["foobar", "foobaz", "blarp"])'
	    ["baz", "bar"]
	 => true

	 jq 'inside(["foobar", "foobaz", "blarp"])'
	    ["bazzzzz", "bar"]
	 => false

	 jq 'inside({"foo": 12, "bar":[1,2,{"barp":12, "blip":13}]})'
	    {"foo": 12, "bar": [{"barp": 12}]}
	 => true

	 jq 'inside({"foo": 12, "bar":[1,2,{"barp":12, "blip":13}]})'
	    {"foo": 12, "bar": [{"barp": 15}]}
	 => false

   startswith(str)
     Outputs true if . starts with the given string argument.

	 jq '[.[]|startswith("foo")]'
	    ["fo", "foo", "barfoo", "foobar", "barfoob"]
	 => [false, true, false, true, false]

   endswith(str)
     Outputs true if . ends with the given string argument.

	 jq '[.[]|endswith("foo")]'
	    ["foobar", "barfoo"]
	 => [false, true]

   combinations, combinations(n)
     Outputs all combinations of the elements of the arrays in the input  array.
     If given an argument n, it outputs all combinations of n repetitions of the
     input array.

	 jq 'combinations'
	    [[1,2], [3, 4]]
	 => [1, 3], [1, 4], [2, 3], [2, 4]

	 jq 'combinations(2)'
	    [0, 1]
	 => [0, 0], [0, 1], [1, 0], [1, 1]

   ltrimstr(str)
     Outputs  its  input with the given prefix string removed, if it starts with
     it.

	 jq '[.[]|ltrimstr("foo")]'
	    ["fo", "foo", "barfoo", "foobar", "afoo"]
	 => ["fo","","barfoo","bar","afoo"]

   rtrimstr(str)
     Outputs its input with the given suffix string removed, if it ends with it.

	 jq '[.[]|rtrimstr("foo")]'
	    ["fo", "foo", "barfoo", "foobar", "foob"]
	 => ["fo","","bar","foobar","foob"]

   trimstr(str)
     Outputs its input with the given string removed at both ends, if it  starts
     or ends with it.

	 jq '[.[]|trimstr("foo")]'
	    ["fo", "foo", "barfoo", "foobarfoo", "foob"]
	 => ["fo","","bar","bar","b"]

   trim, ltrim, rtrim
     trim trims both leading and trailing whitespace.

     ltrim trims only leading (left side) whitespace.

     rtrim trims only trailing (right side) whitespace.

     Whitespace characters are the usual " ", "\n" "\t", "\r" and also all char-
     acters in the Unicode character database with the whitespace property. Note
     that what considers whitespace might change in the future.

	 jq 'trim, ltrim, rtrim'
	    " abc "
	 => "abc", "abc ", " abc"

   explode
     Converts an input string into an array of the string's codepoint numbers.

	 jq 'explode'
	    "foobar"
	 => [102,111,111,98,97,114]

   implode
     The inverse of explode.

	 jq 'implode'
	    [65, 66, 67]
	 => "ABC"

   split(str)
     Splits an input string on the separator argument.

     split  can  also split on regex matches when called with two arguments (see
     the regular expressions section below).

	 jq 'split(", ")'
	    "a, b,c,d, e, "
	 => ["a","b,c,d","e",""]

   join(str)
     Joins the array of elements given as input, using the argument  as  separa-
     tor.  It  is  the	inverse  of  split:  that  is,	running  split("foo")  |
     join("foo") over any input string returns said input string.

     Numbers and booleans in the input are converted to strings. Null values are
     treated as empty strings. Arrays and objects in  the  input  are  not  sup-
     ported.

	 jq 'join(", ")'
	    ["a","b,c,d","e"]
	 => "a, b,c,d, e"

	 jq 'join(" ")'
	    ["a",1,2.3,true,null,false]
	 => "a 1 2.3 true  false"

   ascii_downcase, ascii_upcase
     Emit  a  copy  of	the input string with its alphabetic characters (a-z and
     A-Z) converted to the specified case.

	 jq 'ascii_upcase'
	    "useful but not for A(C)"
	 => "USEFUL BUT NOT FOR A(C)"

   while(cond; update)
     The while(cond; update) function allows you to repeatedly apply  an  update
     to . until cond is false.

     Note that while(cond; update) is internally defined as a recursive jq func-
     tion.  Recursive  calls  within while will not consume additional memory if
     update produces at most one output for each input. See advanced topics  be-
     low.

	 jq '[while(.<100; .*2)]'
	    1
	 => [1,2,4,8,16,32,64]

   repeat(exp)
     The repeat(exp) function allows you to repeatedly apply expression exp to .
     until an error is raised.

     Note that repeat(exp) is internally defined as a recursive jq function. Re-
     cursive  calls within repeat will not consume additional memory if exp pro-
     duces at most one output for each input. See advanced topics below.

	 jq '[repeat(.*2, error)?]'
	    1
	 => [2]

   until(cond; next)
     The until(cond; next) function allows you to repeatedly apply  the  expres-
     sion  next,  initially to . then to its own output, until cond is true. For
     example, this can be used to implement a factorial function (see below).

     Note that until(cond; next) is internally defined as a recursive  jq  func-
     tion.  Recursive calls within until() will not consume additional memory if
     next produces at most one output for each input. See advanced topics below.

	 jq '[.,1]|until(.[0] < 1; [.[0] - 1, .[1] * .[0]])|.[1]'
	    4
	 => 24

   recurse(f), recurse, recurse(f; condition)
     The recurse(f) function allows you to search through a recursive structure,
     and extract interesting data from all levels. Suppose your input represents
     a filesystem:

	 {"name": "/", "children": [
	   {"name": "/bin", "children": [
	     {"name": "/bin/ls", "children": []},
	     {"name": "/bin/sh", "children": []}]},
	   {"name": "/home", "children": [
	     {"name": "/home/stephen", "children": [
	       {"name": "/home/stephen/jq", "children": []}]}]}]}

     Now suppose you want to extract all of the filenames present. You	need  to
     retrieve  .name,  .children[].name, .children[].children[].name, and so on.
     You can do this with:

	 recurse(.children[]) | .name

     When called without an argument, recurse is equivalent to recurse(.[]?).

     recurse(f) is identical to recurse(f; true) and can be  used  without  con-
     cerns about recursion depth.

     recurse(f;  condition)  is  a generator which begins by emitting . and then
     emits in turn .|f, .|f|f, .|f|f|f, ... so long as the computed value satis-
     fies the condition. For example, to generate all the integers, at least  in
     principle, one could write recurse(.+1; true).

     The  recursive calls in recurse will not consume additional memory whenever
     f produces at most a single output for each input.

	 jq 'recurse(.foo[])'
	    {"foo":[{"foo": []}, {"foo":[{"foo":[]}]}]}
	 => {"foo":[{"foo":[]},{"foo":[{"foo":[]}]}]}, {"foo":[]}, {"foo":[{"foo":[]}]}, {"foo":[]}

	 jq 'recurse'
	    {"a":0,"b":[1]}
	 => {"a":0,"b":[1]}, 0, [1], 1

	 jq 'recurse(. * .; . < 20)'
	    2
	 => 2, 4, 16

   walk(f)
     The walk(f) function applies f recursively to every component of the  input
     entity.  When  an	array is encountered, f is first applied to its elements
     and then to the array itself; when an object is encountered, f is first ap-
     plied to all the values and then to the object. In practice, f will usually
     test the type of its input, as illustrated in the following  examples.  The
     first  example  highlights  the usefulness of processing the elements of an
     array of arrays before processing the  array  itself.  The  second  example
     shows  how  all the keys of all the objects within the input can be consid-
     ered for alteration.

	 jq 'walk(if type == "array" then sort else . end)'
	    [[4, 1, 7], [8, 5, 2], [3, 6, 9]]
	 => [[1,4,7],[2,5,8],[3,6,9]]

	 jq 'walk( if type == "object" then with_entries( .key |= sub( "^_+"; "") ) else . end )'
	    [ { "_a": { "__b": 2 } } ]
	 => [{"a":{"b":2}}]

   have_literal_numbers
     This builtin returns true if jq's build configuration includes support  for
     preservation of input number literals.

   have_decnum
     This  builtin returns true if jq was built with "decnum", which is the cur-
     rent literal number preserving numeric backend implementation for jq.

   $JQ_BUILD_CONFIGURATION
     This builtin binding shows the jq	executable's  build  configuration.  Its
     value  has  no particular format, but it can be expected to be at least the
     ./configure command-line arguments, and may be enriched in  the  future  to
     include the version strings for the build tooling used.

     Note that this can be overridden in the command-line with --arg and related
     options.

   $ENV, env
     $ENV is an object representing the environment variables as set when the jq
     program started.

     env outputs an object representing jq's current environment.

     At the moment there is no builtin for setting environment variables.

	 jq '$ENV.PAGER'
	    null
	 => "less"

	 jq 'env.PAGER'
	    null
	 => "less"

   transpose
     Transpose	a  possibly  jagged matrix (an array of arrays). Rows are padded
     with nulls so the result is always rectangular.

	 jq 'transpose'
	    [[1], [2,3]]
	 => [[1,2],[null,3]]

   bsearch(x)
     bsearch(x) conducts a binary search for x in the input array. If the  input
     is  sorted and contains x, then bsearch(x) will return its index in the ar-
     ray; otherwise, if the array is sorted, it will return (-1 - ix)  where  ix
     is  an  insertion point such that the array would still be sorted after the
     insertion of x at ix. If the array is not sorted, bsearch(x) will return an
     integer that is probably of no interest.

	 jq 'bsearch(0)'
	    [0,1]
	 => 0

	 jq 'bsearch(0)'
	    [1,2,3]
	 => -1

	 jq 'bsearch(4) as $ix | if $ix < 0 then .[-(1+$ix)] = 4 else . end'
	    [1,2,3]
	 => [1,2,3,4]

   String interpolation: \(exp)
     Inside a string, you can put an expression inside parens after a backslash.
     Whatever the expression returns will be interpolated into the string.

	 jq '"The input was \(.), which is one less than \(.+1)"'
	    42
	 => "The input was 42, which is one less than 43"

   Convert to/from JSON
     The tojson and fromjson builtins dump values as JSON texts  or  parse  JSON
     texts  into  values, respectively. The tojson builtin differs from tostring
     in that tostring returns strings unmodified, while tojson	encodes  strings
     as JSON strings.

	 jq '[.[]|tostring]'
	    [1, "foo", ["foo"]]
	 => ["1","foo","[\"foo\"]"]

	 jq '[.[]|tojson]'
	    [1, "foo", ["foo"]]
	 => ["1","\"foo\"","[\"foo\"]"]

	 jq '[.[]|tojson|fromjson]'
	    [1, "foo", ["foo"]]
	 => [1,"foo",["foo"]]

   Format strings and escaping
     The  @foo	syntax is used to format and escape strings, which is useful for
     building URLs, documents in a language like HTML or XML, and so forth. @foo
     can be used as a filter on its own, the possible escapings are:

     @text:

	    Calls tostring, see that function for details.

     @json:

	    Serializes the input as JSON.

     @html:

	    Applies HTML/XML escaping, by mapping the characters <>&'" to  their
	    entity equivalents &lt;, &gt;, &amp;, &apos;, &quot;.

     @uri:

	    Applies  percent-encoding, by mapping all reserved URI characters to
	    a %XX sequence.

     @urid:

	    The inverse of @uri, applies percent-decoding, by  mapping	all  %XX
	    sequences to their corresponding URI characters.

     @csv:

	    The  input	must  be an array, and it is rendered as CSV with double
	    quotes for strings, and quotes escaped by repetition.

     @tsv:

	    The input must be an array, and it is rendered as TSV (tab-separated
	    values). Each input array will be printed as a single  line.  Fields
	    are  separated  by	a  single  tab	(ascii	0x09).	Input characters
	    line-feed (ascii 0x0a), carriage-return  (ascii  0x0d),  tab  (ascii
	    0x09)  and backslash (ascii 0x5c) will be output as escape sequences
	    \n, \r, \t, \\ respectively.

     @sh:

	    The input is escaped suitable for use in a command-line for a  POSIX
	    shell.  If	the  input  is	an array, the output will be a series of
	    space-separated strings.

     @base64:

	    The input is converted to base64 as specified by RFC 4648.

     @base64d:

	    The inverse of @base64, input is decoded as specified by  RFC  4648.
	    Note\:  If	the  decoded  string is not UTF-8, the results are unde-
	    fined.

     This syntax can be combined with string interpolation in a useful way.  You
     can  follow  a @foo token with a string literal. The contents of the string
     literal will not be escaped. However, all interpolations made  inside  that
     string literal will be escaped. For instance,

	 @uri "https://www.google.com/search?q=\(.search)"

     will produce the following output for the input {"search":"what is jq?"}:

	 "https://www.google.com/search?q=what%20is%20jq%3F"

     Note  that  the slashes, question mark, etc. in the URL are not escaped, as
     they were part of the string literal.

	 jq '@html'
	    "This works if x < y"
	 => "This works if x &lt; y"

	 jq '@sh "echo \(.)"'
	    "O'Hara's Ale"
	 => "echo 'O'\\''Hara'\\''s Ale'"

	 jq '@base64'
	    "This is a message"
	 => "VGhpcyBpcyBhIG1lc3NhZ2U="

	 jq '@base64d'
	    "VGhpcyBpcyBhIG1lc3NhZ2U="
	 => "This is a message"

   Dates
     jq provides some basic date handling functionality,  with	some  high-level
     and  low-level  builtins. In all cases these builtins deal exclusively with
     time in UTC.

     The fromdateiso8601 builtin parses datetimes in the ISO 8601  format  to  a
     number  of  seconds  since  the  Unix epoch (1970-01-01T00:00:00Z). The to-
     dateiso8601 builtin does the inverse.

     The fromdate builtin parses datetime strings. Currently fromdate only  sup-
     ports ISO 8601 datetime strings, but in the future it will attempt to parse
     datetime strings in more formats.

     The todate builtin is an alias for todateiso8601.

     The now builtin outputs the current time, in seconds since the Unix epoch.

     Low-level	jq interfaces to the C-library time functions are also provided:
     strptime, strftime, strflocaltime, mktime, gmtime, and localtime. Refer  to
     your  host  operating system's documentation for the format strings used by
     strptime and strftime. Note: these are not necessarily stable interfaces in
     jq, particularly as to their localization functionality.

     The gmtime builtin consumes a number of seconds since the	Unix  epoch  and
     outputs  a  "broken  down time" representation of Greenwich Mean Time as an
     array of  numbers	representing  (in  this  order):  the  year,  the  month
     (zero-based),  the  day  of the month (one-based), the hour of the day, the
     minute of the hour, the second of the minute, the day of the week, and  the
     day  of  the  year -- all one-based unless otherwise stated. The day of the
     week number may be wrong on some systems for dates before March  1st  1900,
     or after December 31 2099.

     The  localtime  builtin  works like the gmtime builtin, but using the local
     timezone setting.

     The mktime builtin consumes "broken down time" representations of time out-
     put by gmtime and strptime.

     The strptime(fmt) builtin parses input strings matching the  fmt  argument.
     The  output  is in the "broken down time" representation consumed by mktime
     and output by gmtime.

     The strftime(fmt) builtin formats a time (GMT) with the given  format.  The
     strflocaltime does the same, but using the local timezone setting.

     The format strings for strptime and strftime are described in typical C li-
     brary   documentation.   The   format  string  for  ISO  8601  datetime  is
     "%Y-%m-%dT%H:%M:%SZ".

     jq may not support some or all of this date functionality on some	systems.
     In particular, the %u and %j specifiers for strptime(fmt) are not supported
     on macOS.

	 jq 'fromdate'
	    "2015-03-05T23:51:47Z"
	 => 1425599507

	 jq 'strptime("%Y-%m-%dT%H:%M:%SZ")'
	    "2015-03-05T23:51:47Z"
	 => [2015,2,5,23,51,47,4,63]

	 jq 'strptime("%Y-%m-%dT%H:%M:%SZ")|mktime'
	    "2015-03-05T23:51:47Z"
	 => 1425599507

   SQL-Style Operators
     jq provides a few SQL-style operators.

     INDEX(stream; index_expression):

	    This builtin produces an object whose keys are computed by the given
	    index expression applied to each value from the given stream.

     JOIN($idx; stream; idx_expr; join_expr):

	    This builtin joins the values from the given stream to the given in-
	    dex.  The  index's keys are computed by applying the given index ex-
	    pression to each value from the given stream. An array of the  value
	    in	the  stream and the corresponding value from the index is fed to
	    the given join expression to produce each result.

     JOIN($idx; stream; idx_expr):

	    Same as JOIN($idx; stream; idx_expr; .).

     JOIN($idx; idx_expr):

	    This builtin joins the input . to  the  given  index,  applying  the
	    given index expression to . to compute the index key. The join oper-
	    ation is as described above.

     IN(s):

	    This  builtin  outputs true if . appears in the given stream, other-
	    wise it outputs false.

     IN(source; s):

	    This builtin outputs true if any value in the source stream  appears
	    in the second stream, otherwise it outputs false.

   builtins
     Returns  a  list  of  all builtin functions in the format name/arity. Since
     functions with the same name but different arities are considered	separate
     functions, all/0, all/1, and all/2 would all be present in the list.

CONDITIONALS AND COMPARISONS
   ==, !=
     The  expression 'a == b' will produce 'true' if the results of evaluating a
     and b are equal (that is, if they represent  equivalent  JSON  values)  and
     'false'  otherwise.  In  particular,  strings are never considered equal to
     numbers. In checking for the equality of JSON objects, the ordering of keys
     is irrelevant. If you're coming from JavaScript, please note that	jq's  ==
     is like JavaScript's ===, the "strict equality" operator.

     != is "not equal", and 'a != b' returns the opposite value of 'a == b'

	 jq '. == false'
	    null
	 => false

	 jq '. == {"b": {"d": (4 + 1e-20), "c": 3}, "a":1}'
	    {"a":1, "b": {"c": 3, "d": 4}}
	 => true

	 jq '.[] == 1'
	    [1, 1.0, "1", "banana"]
	 => true, true, false, false

   if-then-else-end
     if  A  then B else C end will act the same as B if A produces a value other
     than false or null, but act the same as C otherwise.

     if A then B end is the same as if A then B else .	end. That is,  the  else
     branch  is  optional,  and if absent is the same as .. This also applies to
     elif with absent ending else branch.

     Checking for false or null is a simpler  notion  of  "truthiness"	than  is
     found  in	JavaScript or Python, but it means that you'll sometimes have to
     be more explicit about the condition you want. You can't test whether, e.g.
     a string is empty using if .name then A else B end; you'll  need  something
     like if .name == "" then A else B end instead.

     If  the condition A produces multiple results, then B is evaluated once for
     each result that is not false or null, and C is  evaluated  once  for  each
     false or null.

     More cases can be added to an if using elif A then B syntax.

	 jq 'if . == 0 then
	   "zero"
	 elif . == 1 then
	   "one"
	 else
	   "many"
	 end'
	    2
	 => "many"

   >, >=, <=, <
     The comparison operators >, >=, <=, < return whether their left argument is
     greater  than, greater than or equal to, less than or equal to or less than
     their right argument (respectively).

     The ordering is the same as that described for sort, above.

	 jq '. < 5'
	    2
	 => true

   and, or, not
     jq supports the normal Boolean operators and, or, not. They have  the  same
     standard  of truth as if expressions - false and null are considered "false
     values", and anything else is a "true value".

     If an operand of one of these operators produces multiple results, the  op-
     erator itself will produce a result for each input.

     not  is in fact a builtin function rather than an operator, so it is called
     as a filter to which things can be piped rather than with	special  syntax,
     as in .foo and .bar | not.

     These  three only produce the values true and false, and so are only useful
     for genuine Boolean operations, rather than the common Perl/Python/Ruby id-
     iom of "value_that_may_be_null or default". If you want to use this form of
     "or", picking between two values rather than evaluating  a  condition,  see
     the // operator below.

	 jq '42 and "a string"'
	    null
	 => true

	 jq '(true, false) or false'
	    null
	 => true, false

	 jq '(true, true) and (true, false)'
	    null
	 => true, false, true, false

	 jq '[true, false | not]'
	    null
	 => [false, true]

   Alternative operator: //
     The // operator produces all the values of its left-hand side that are nei-
     ther  false  nor  null. If the left-hand side produces no values other than
     false or null, then // produces all the values of its right-hand side.

     A filter of the form a // b produces all the results  of  a  that	are  not
     false  or null. If a produces no results, or no results other than false or
     null, then a // b produces the results of b.

     This is useful for providing defaults: .foo // 1  will  evaluate  to  1  if
     there's  no  .foo element in the input. It's similar to how or is sometimes
     used in Python (jq's or operator is reserved for  strictly  Boolean  opera-
     tions).

     Note: some_generator // defaults_here is not the same as some_generator | .
     // defaults_here. The latter will produce default values for all non-false,
     non-null  values  of  the left-hand side, while the former will not. Prece-
     dence rules can make this confusing. For example, in  false,  1  //  2  the
     left-hand	side  of  // is 1, not false, 1 -- false, 1 // 2 parses the same
     way as false, (1 // 2). In (false, null, 1) | . // 42 the left-hand side of
     // is ., which always produces just one value, while in (false, null, 1) //
     42 the left-hand side is a generator of three values, and since it produces
     a value other false and null, the default 42 is not produced.

	 jq 'empty // 42'
	    null
	 => 42

	 jq '.foo // 42'
	    {"foo": 19}
	 => 19

	 jq '.foo // 42'
	    {}
	 => 42

	 jq '(false, null, 1) // 42'
	    null
	 => 1

	 jq '(false, null, 1) | . // 42'
	    null
	 => 42, 42, 1

   try-catch
     Errors can be caught by using try EXP catch EXP. The  first  expression  is
     executed,	and  if it fails then the second is executed with the error mes-
     sage. The output of the handler, if any, is output as if it  had  been  the
     output of the expression to try.

     The try EXP form uses empty as the exception handler.

	 jq 'try .a catch ". is not an object"'
	    true
	 => ". is not an object"

	 jq '[.[]|try .a]'
	    [{}, true, {"a":1}]
	 => [null, 1]

	 jq 'try error("some exception") catch .'
	    true
	 => "some exception"

   Breaking out of control structures
     A	convenient  use  of try/catch is to break out of control structures like
     reduce, foreach, while, and so on.

     For example:

	 # Repeat an expression until it raises "break" as an
	 # error, then stop repeating without re-raising the error.
	 # But if the error caught is not "break" then re-raise it.
	 try repeat(exp) catch if .=="break" then empty else error

     jq has a syntax for named lexical labels to "break" or "go (back) to":

	 label $out | ... break $out ...

     The break $label_name expression will cause the program to  act  as  though
     the nearest (to the left) label $label_name produced empty.

     The  relationship between the break and corresponding label is lexical: the
     label has to be "visible" from the break.

     To break out of a reduce, for example:

	 label $out | reduce .[] as $item (null; if .==false then break $out else ... end)

     The following jq program produces a syntax error:

	 break $out

     because no label $out is visible.

   Error Suppression / Optional Operator: ?
     The ? operator, used as EXP?, is shorthand for try EXP.

	 jq '[.[] | .a?]'
	    [{}, true, {"a":1}]
	 => [null, 1]

	 jq '[.[] | tonumber?]'
	    ["1", "invalid", "3", 4]
	 => [1, 3, 4]

REGULAR EXPRESSIONS
     jq uses the Oniguruma regular expression library, as do PHP, TextMate, Sub-
     lime Text, etc, so the description here will focus on jq specifics.

     Oniguruma supports several flavors of regular expression, so it  is  impor-
     tant to know that jq uses the "Perl NG" (Perl with named groups) flavor.

     The  jq  regex  filters  are  defined so that they can be used using one of
     these patterns:

	 STRING | FILTER(REGEX)
	 STRING | FILTER(REGEX; FLAGS)
	 STRING | FILTER([REGEX])
	 STRING | FILTER([REGEX, FLAGS])

     where:

     *	 STRING, REGEX, and FLAGS are jq strings and subject to jq string inter-
	 polation;

     *	 REGEX, after string interpolation, should be a  valid	regular  expres-
	 sion;

     *	 FILTER is one of test, match, or capture, as described below.

     Since REGEX must evaluate to a JSON string, some characters that are needed
     to  form a regular expression must be escaped. For example, the regular ex-
     pression \s signifying a whitespace character would be written as "\\s".

     FLAGS is a string consisting of one of more of the supported flags:

     *	 g - Global search (find all matches, not just the first)

     *	 i - Case insensitive search

     *	 m - Multi line mode (. will match newlines)

     *	 n - Ignore empty matches

     *	 p - Both s and m modes are enabled

     *	 s - Single line mode (^ -> \A, $ -> \Z)

     *	 l - Find longest possible matches

     *	 x - Extended regex format (ignore whitespace and comments)

     To match a whitespace with the x flag, use \s, e.g.

	 jq -n '"a b" | test("a\\sb"; "x")'

     Note that certain flags may also be specified within REGEX, e.g.

	 jq -n '("test", "TEst", "teST", "TEST") | test("(?i)te(?-i)st")'

     evaluates to: true, true, false, false.

   test(val), test(regex; flags)
     Like match, but does not return match  objects,  only  true  or  false  for
     whether or not the regex matches the input.

	 jq 'test("foo")'
	    "foo"
	 => true

	 jq '.[] | test("a b c # spaces are ignored"; "ix")'
	    ["xabcd", "ABC"]
	 => true, true

   match(val), match(regex; flags)
     match outputs an object for each match it finds. Matches have the following
     fields:

     *	 offset - offset in UTF-8 codepoints from the beginning of the input

     *	 length - length in UTF-8 codepoints of the match

     *	 string - the string that it matched

     *	 captures - an array of objects representing capturing groups.

     Capturing group objects have the following fields:

     *	 offset - offset in UTF-8 codepoints from the beginning of the input

     *	 length - length in UTF-8 codepoints of this capturing group

     *	 string - the string that was captured

     *	 name - the name of the capturing group (or null if it was unnamed)

     Capturing groups that did not match anything return an offset of -1

	 jq 'match("(abc)+"; "g")'
	    "abc abc"
	 => {"offset": 0, "length": 3, "string": "abc", "captures": [{"offset": 0, "length": 3, "string": "abc", "name": null}]}, {"offset": 4, "length": 3, "string": "abc", "captures": [{"offset": 4, "length": 3, "string": "abc", "name": null}]}

	 jq 'match("foo")'
	    "foo bar foo"
	 => {"offset": 0, "length": 3, "string": "foo", "captures": []}

	 jq 'match(["foo", "ig"])'
	    "foo bar FOO"
	 => {"offset": 0, "length": 3, "string": "foo", "captures": []}, {"offset": 8, "length": 3, "string": "FOO", "captures": []}

	 jq 'match("foo (?<bar123>bar)? foo"; "ig")'
	    "foo bar foo foo  foo"
	 => {"offset": 0, "length": 11, "string": "foo bar foo", "captures": [{"offset": 4, "length": 3, "string": "bar", "name": "bar123"}]}, {"offset": 12, "length": 8, "string": "foo  foo", "captures": [{"offset": -1, "length": 0, "string": null, "name": "bar123"}]}

	 jq '[ match("."; "g")] | length'
	    "abc"
	 => 3

   capture(val), capture(regex; flags)
     Collects the named captures in a JSON object, with the name of each capture
     as the key, and the matched string as the corresponding value.

	 jq 'capture("(?<a>[a-z]+)-(?<n>[0-9]+)")'
	    "xyzzy-14"
	 => { "a": "xyzzy", "n": "14" }

   scan(regex), scan(regex; flags)
     Emit a stream of the non-overlapping substrings of the input that match the
     regex in accordance with the flags, if any have been specified. If there is
     no  match,  the  stream is empty. To capture all the matches for each input
     string, use the idiom [ expr ], e.g. [ scan(regex) ]. If the regex contains
     capturing groups, the filter emits a stream of arrays, each of  which  con-
     tains the captured strings.

	 jq 'scan("c")'
	    "abcdefabc"
	 => "c", "c"

	 jq 'scan("(a+)(b+)")'
	    "abaabbaaabbb"
	 => ["a","b"], ["aa","bb"], ["aaa","bbb"]

   split(regex; flags)
     Splits an input string on each regex match.

     For  backwards  compatibility,  when  called  with a single argument, split
     splits on a string, not a regex.

	 jq 'split(", *"; null)'
	    "ab,cd, ef"
	 => ["ab","cd","ef"]

   splits(regex), splits(regex; flags)
     These provide the same results as their split counterparts, but as a stream
     instead of an array.

	 jq 'splits(", *")'
	    "ab,cd,   ef, gh"
	 => "ab", "cd", "ef", "gh"

	 jq 'splits(",? *"; "n")'
	    "ab,cd ef,	gh"
	 => "ab", "cd", "ef", "gh"

   sub(regex; tostring), sub(regex; tostring; flags)
     Emit the string obtained by replacing the first match of regex in the input
     string with tostring, after interpolation. tostring should be a  jq  string
     or  a stream of such strings, each of which may contain references to named
     captures. The named captures are, in effect, presented as a JSON object (as
     constructed by capture) to tostring, so a reference to a captured	variable
     named "x" would take the form: "\(.x)".

	 jq 'sub("[^a-z]*(?<x>[a-z]+)"; "Z\(.x)"; "g")'
	    "123abc456def"
	 => "ZabcZdef"

	 jq '[sub("(?<a>.)"; "\(.a|ascii_upcase)", "\(.a|ascii_downcase)")]'
	    "aB"
	 => ["AB","aB"]

   gsub(regex; tostring), gsub(regex; tostring; flags)
     gsub  is  like sub but all the non-overlapping occurrences of the regex are
     replaced by tostring, after interpolation. If  the  second  argument  is  a
     stream of jq strings, then gsub will produce a corresponding stream of JSON
     strings.

	 jq 'gsub("(?<x>.)[^a]*"; "+\(.x)-")'
	    "Abcabc"
	 => "+A-+a-"

	 jq '[gsub("p"; "a", "b")]'
	    "p"
	 => ["a","b"]

ADVANCED FEATURES
     Variables	are  an  absolute  necessity  in most programming languages, but
     they're relegated to an "advanced feature" in jq.

     In most languages, variables are the only means of passing around data.  If
     you  calculate  a value, and you want to use it more than once, you'll need
     to store it in a variable. To pass a value to another part of the	program,
     you'll  need  that  part of the program to define a variable (as a function
     parameter, object member, or whatever) in which to place the data.

     It is also possible to define functions in jq, although this is is  a  fea-
     ture whose biggest use is defining jq's standard library (many jq functions
     such as map and select are in fact written in jq).

     jq  has  reduction  operators,  which  are  very powerful but a bit tricky.
     Again, these are mostly used internally, to define some useful bits of jq's
     standard library.

     It may not be obvious at first, but jq is all about generators (yes, as of-
     ten found in other languages). Some utilities are	provided  to  help  deal
     with generators.

     Some  minimal  I/O  support  (besides reading JSON from standard input, and
     writing JSON to standard output) is available.

     Finally, there is a module/library system.

   Variable / Symbolic Binding Operator: ... as $identifier | ...
     In jq, all filters have an input and an output, so manual plumbing  is  not
     necessary	to pass a value from one part of a program to the next. Many ex-
     pressions, for instance a + b, pass their input to two distinct  subexpres-
     sions  (here  a  and b are both passed the same input), so variables aren't
     usually necessary in order to use a value twice.

     For instance, calculating the average value of an array of numbers requires
     a few variables in most languages - at least one to hold the array, perhaps
     one for each element or for a loop counter. In jq, it's simply add / length
     - the add expression is given the array  and  produces  its  sum,	and  the
     length expression is given the array and produces its length.

     So,  there's  generally  a  cleaner  way  to solve most problems in jq than
     defining variables. Still, sometimes they do make things easier, so jq lets
     you define variables using expression  as	$variable.  All  variable  names
     start with $. Here's a slightly uglier version of the array-averaging exam-
     ple:

	 length as $array_length | add / $array_length

     We'll need a more complicated problem to find a situation where using vari-
     ables actually makes our lives easier.

     Suppose  we  have an array of blog posts, with "author" and "title" fields,
     and another object which is used to map author usernames to real names. Our
     input looks like:

	 {"posts": [{"title": "First post", "author": "anon"},
		    {"title": "A well-written article", "author": "person1"}],
	  "realnames": {"anon": "Anonymous Coward",
			"person1": "Person McPherson"}}

     We want to produce the posts with the author field containing a real  name,
     as in:

	 {"title": "First post", "author": "Anonymous Coward"}
	 {"title": "A well-written article", "author": "Person McPherson"}

     We  use  a  variable, $names, to store the realnames object, so that we can
     refer to it later when looking up author usernames:

	 .realnames as $names | .posts[] | {title, author: $names[.author]}

     The expression exp as $x | ... means: for each value of expression exp, run
     the rest of the pipeline with the entire original input, and with $x set to
     that value. Thus as functions as something of a foreach loop.

     Just as {foo} is a handy way of writing {foo: .foo}, so {$foo} is	a  handy
     way of writing {foo: $foo}.

     Multiple  variables may be declared using a single as expression by provid-
     ing a pattern that matches the structure of the input  (this  is  known  as
     "destructuring"):

	 . as {realnames: $names, posts: [$first, $second]} | ...

     The  variable declarations in array patterns (e.g., . as [$first, $second])
     bind to the elements of the array in from the element at index zero on  up,
     in order. When there is no value at the index for an array pattern element,
     null is bound to that variable.

     Variables are scoped over the rest of the expression that defines them, so

	 .realnames as $names | (.posts[] | {title, author: $names[.author]})

     will work, but

	 (.realnames as $names | .posts[]) | {title, author: $names[.author]}

     won't.

     For programming language theorists, it's more accurate to say that jq vari-
     ables are lexically-scoped bindings. In particular there's no way to change
     the  value  of  a	binding;  one can only setup a new binding with the same
     name, but which will not be visible where the old one was.

	 jq '.bar as $x | .foo | . + $x'
	    {"foo":10, "bar":200}
	 => 210

	 jq '. as $i|[(.*2|. as $i| $i), $i]'
	    5
	 => [10,5]

	 jq '. as [$a, $b, {c: $c}] | $a + $b + $c'
	    [2, 3, {"c": 4, "d": 5}]
	 => 9

	 jq '.[] as [$a, $b] | {a: $a, b: $b}'
	    [[0], [0, 1], [2, 1, 0]]
	 => {"a":0,"b":null}, {"a":0,"b":1}, {"a":2,"b":1}

   Destructuring Alternative Operator: ?//
     The destructuring alternative operator provides a concise mechanism for de-
     structuring an input that can take one of several forms.

     Suppose we have an API that returns a list of resources and events  associ-
     ated  with  them, and we want to get the user_id and timestamp of the first
     event for each resource. The API (having been clumsily converted from  XML)
     will only wrap the events in an array if the resource has multiple events:

	 {"resources": [{"id": 1, "kind": "widget", "events": {"action": "create", "user_id": 1, "ts": 13}},
			{"id": 2, "kind": "widget", "events": [{"action": "create", "user_id": 1, "ts": 14}, {"action": "destroy", "user_id": 1, "ts": 15}]}]}

     We can use the destructuring alternative operator to handle this structural
     change simply:

	 .resources[] as {$id, $kind, events: {$user_id, $ts}} ?// {$id, $kind, events: [{$user_id, $ts}]} | {$user_id, $kind, $id, $ts}

     Or, if we aren't sure if the input is an array of values or an object:

	 .[] as [$id, $kind, $user_id, $ts] ?// {$id, $kind, $user_id, $ts} | ...

     Each  alternative	need not define all of the same variables, but all named
     variables will be available to the  subsequent  expression.  Variables  not
     matched in the alternative that succeeded will be null:

	 .resources[] as {$id, $kind, events: {$user_id, $ts}} ?// {$id, $kind, events: [{$first_user_id, $first_ts}]} | {$user_id, $first_user_id, $kind, $id, $ts, $first_ts}

     Additionally,  if	the subsequent expression returns an error, the alterna-
     tive operator will attempt to try the next binding. Errors that occur  dur-
     ing the final alternative are passed through.

	 [[3]] | .[] as [$a] ?// [$b] | if $a != null then error("err: \($a)") else {$a,$b} end

	 jq '.[] as {$a, $b, c: {$d, $e}} ?// {$a, $b, c: [{$d, $e}]} | {$a, $b, $d, $e}'
	    [{"a": 1, "b": 2, "c": {"d": 3, "e": 4}}, {"a": 1, "b": 2, "c": [{"d": 3, "e": 4}]}]
	 => {"a":1,"b":2,"d":3,"e":4}, {"a":1,"b":2,"d":3,"e":4}

	 jq '.[] as {$a, $b, c: {$d}} ?// {$a, $b, c: [{$e}]} | {$a, $b, $d, $e}'
	    [{"a": 1, "b": 2, "c": {"d": 3, "e": 4}}, {"a": 1, "b": 2, "c": [{"d": 3, "e": 4}]}]
	 => {"a":1,"b":2,"d":3,"e":null}, {"a":1,"b":2,"d":null,"e":4}

	 jq '.[] as [$a] ?// [$b] | if $a != null then error("err: \($a)") else {$a,$b} end'
	    [[3]]
	 => {"a":null,"b":3}

   Defining Functions
     You can give a filter a name using "def" syntax:

	 def increment: . + 1;

     From  then on, increment is usable as a filter just like a builtin function
     (in fact, this is how many of the builtins are  defined).	A  function  may
     take arguments:

	 def map(f): [.[] | f];

     Arguments	are passed as filters (functions with no arguments), not as val-
     ues. The same argument may be referenced multiple times with different  in-
     puts  (here  f  is run for each element of the input array). Arguments to a
     function work more like callbacks than like value arguments. This is impor-
     tant to understand. Consider:

	 def foo(f): f|f;
	 5|foo(.*2)

     The result will be 20 because f is .*2, and during the first invocation  of
     f	.  will  be  5, and the second time it will be 10 (5 * 2), so the result
     will be 20. Function arguments are filters, and  filters  expect  an  input
     when invoked.

     If you want the value-argument behaviour for defining simple functions, you
     can just use a variable:

	 def addvalue(f): f as $f | map(. + $f);

     Or use the short-hand:

	 def addvalue($f): ...;

     With  either  definition,	addvalue(.foo) will add the current input's .foo
     field to each element of the array. Do note that calling addvalue(.[]) will
     cause the map(. + $f) part to be evaluated once per value in the value of .
     at the call site.

     Multiple definitions using the same function name are allowed. Each re-def-
     inition replaces the previous one for the same  number  of  function  argu-
     ments,  but only for references from functions (or main program) subsequent
     to the re-definition. See also the section below on scoping.

	 jq 'def addvalue(f): . + [f]; map(addvalue(.[0]))'
	    [[1,2],[10,20]]
	 => [[1,2,1], [10,20,10]]

	 jq 'def addvalue(f): f as $x | map(. + $x); addvalue(.[0])'
	    [[1,2],[10,20]]
	 => [[1,2,1,2], [10,20,1,2]]

   Scoping
     There are two types of symbols in jq: value bindings (a.k.a., "variables"),
     and functions. Both are scoped lexically, with expressions  being	able  to
     refer  only  to  symbols  that have been defined "to the left" of them. The
     only exception to this rule is that functions can refer to themselves so as
     to be able to create recursive functions.

     For example, in the following expression there is a binding which is  visi-
     ble  "to the right" of it, ... | .*3 as $times_three | [. + $times_three] |
     ..., but not "to the left". Consider this expression now,	...  |	(.*3  as
     $times_three  | [. + $times_three]) | ...: here the binding $times_three is
     not visible past the closing parenthesis.

   isempty(exp)
     Returns true if exp produces no outputs, false otherwise.

	 jq 'isempty(empty)'
	    null
	 => true

	 jq 'isempty(.[])'
	    []
	 => true

	 jq 'isempty(.[])'
	    [1,2,3]
	 => false

   limit(n; expr)
     The limit function extracts up to n outputs from expr.

	 jq '[limit(3; .[])]'
	    [0,1,2,3,4,5,6,7,8,9]
	 => [0,1,2]

   skip(n; expr)
     The skip function skips the first n outputs from expr.

	 jq '[skip(3; .[])]'
	    [0,1,2,3,4,5,6,7,8,9]
	 => [3,4,5,6,7,8,9]

   first(expr), last(expr), nth(n; expr)
     The first(expr) and last(expr) functions extract the first and last  values
     from expr, respectively.

     The  nth(n; expr) function extracts the nth value output by expr. Note that
     nth(n; expr) doesn't support negative values of n.

	 jq '[first(range(.)), last(range(.)), nth(5; range(.))]'
	    10
	 => [0,9,5]

	 jq '[first(empty), last(empty), nth(5; empty)]'
	    null
	 => []

   first, last, nth(n)
     The first and last functions extract the first and last values from any ar-
     ray at ..

     The nth(n) function extracts the nth value of any array at ..

	 jq '[range(.)]|[first, last, nth(5)]'
	    10
	 => [0,9,5]

   reduce
     The reduce syntax allows you to combine all of the results of an expression
     by accumulating them into a single answer. The form is reduce EXP	as  $var
     (INIT; UPDATE). As an example, we'll pass [1,2,3] to this expression:

	 reduce .[] as $item (0; . + $item)

     For each result that .[] produces, . + $item is run to accumulate a running
     total,  starting  from  0 as the input value. In this example, .[] produces
     the results 1, 2, and 3, so the effect is similar to running something like
     this:

	 0 | 1 as $item | . + $item |
	     2 as $item | . + $item |
	     3 as $item | . + $item

	 jq 'reduce .[] as $item (0; . + $item)'
	    [1,2,3,4,5]
	 => 15

	 jq 'reduce .[] as [$i,$j] (0; . + $i * $j)'
	    [[1,2],[3,4],[5,6]]
	 => 44

	 jq 'reduce .[] as {$x,$y} (null; .x += $x | .y += [$y])'
	    [{"x":"a","y":1},{"x":"b","y":2},{"x":"c","y":3}]
	 => {"x":"abc","y":[1,2,3]}

   foreach
     The foreach syntax is similar to reduce, but intended  to	allow  the  con-
     struction of limit and reducers that produce intermediate results.

     The  form	is  foreach  EXP as $var (INIT; UPDATE; EXTRACT). As an example,
     we'll pass [1,2,3] to this expression:

	 foreach .[] as $item (0; . + $item; [$item, . * 2])

     Like the reduce syntax, . + $item is run for each result that .[] produces,
     but [$item, . * 2] is run for each intermediate values.  In  this	example,
     since  the intermediate values are 1, 3, and 6, the foreach expression pro-
     duces [1,2], [2,6], and [3,12]. So the effect is similar to  running  some-
     thing like this:

	 0 | 1 as $item | . + $item | [$item, . * 2],
	     2 as $item | . + $item | [$item, . * 2],
	     3 as $item | . + $item | [$item, . * 2]

     When  EXTRACT  is omitted, the identity filter is used. That is, it outputs
     the intermediate values as they are.

	 jq 'foreach .[] as $item (0; . + $item)'
	    [1,2,3,4,5]
	 => 1, 3, 6, 10, 15

	 jq 'foreach .[] as $item (0; . + $item; [$item, . * 2])'
	    [1,2,3,4,5]
	 => [1,2], [2,6], [3,12], [4,20], [5,30]

	 jq 'foreach .[] as $item (0; . + 1; {index: ., $item})'
	    ["foo", "bar", "baz"]
	 => {"index":1,"item":"foo"}, {"index":2,"item":"bar"}, {"index":3,"item":"baz"}

   Recursion
     As described above, recurse uses recursion, and any jq function can be  re-
     cursive. The while builtin is also implemented in terms of recursion.

     Tail  calls are optimized whenever the expression to the left of the recur-
     sive call outputs its last value. In practice this means that  the  expres-
     sion  to  the  left  of the recursive call should not produce more than one
     output for each input.

     For example:

	 def recurse(f): def r: ., (f | select(. != null) | r); r;

	 def while(cond; update):
	   def _while:
	     if cond then ., (update | _while) else empty end;
	   _while;

	 def repeat(exp):
	   def _repeat:
	     exp, _repeat;
	   _repeat;

   Generators and iterators
     Some jq operators and functions are actually generators in  that  they  can
     produce  zero, one, or more values for each input, just as one might expect
     in other programming languages that have generators. For example, .[]  gen-
     erates  all  the values in its input (which must be an array or an object),
     range(0; 10) generates the integers between 0 and 10, and so on.

     Even the comma operator is a generator, generating first the values  gener-
     ated  by the expression to the left of the comma, then the values generated
     by the expression on the right of the comma.

     The empty builtin is the generator that produces zero  outputs.  The  empty
     builtin backtracks to the preceding generator expression.

     All  jq functions can be generators just by using builtin generators. It is
     also possible to construct new generators	using  only  recursion	and  the
     comma  operator. If recursive calls are "in tail position" then the genera-
     tor will be efficient. In the example below the recursive call by _range to
     itself is in tail position. The example shows off	three  advanced  topics:
     tail recursion, generator construction, and sub-functions.

	 jq 'def range(init; upto; by): def _range: if (by > 0 and . < upto) or (by < 0 and . > upto) then ., ((.+by)|_range) else empty end; if init == upto then empty elif by == 0 then init else init|_range end; range(0; 10; 3)'
	    null
	 => 0, 3, 6, 9

	 jq 'def while(cond; update): def _while: if cond then ., (update | _while) else empty end; _while; [while(.<100; .*2)]'
	    1
	 => [1,2,4,8,16,32,64]

MATH
     jq currently only has IEEE754 double-precision (64-bit) floating point num-
     ber support.

     Besides  simple  arithmetic  operators such as +, jq also has most standard
     math functions from the C math library. C math functions that take a single
     input argument (e.g., sin()) are available as zero-argument jq functions. C
     math functions that take two input arguments (e.g., pow()) are available as
     two-argument jq functions that ignore .. C math functions that  take  three
     input arguments are available as three-argument jq functions that ignore ..

     Availability  of standard math functions depends on the availability of the
     corresponding math functions in your operating system and C  math	library.
     Unavailable math functions will be defined but will raise an error.

     One-input	C math functions: acos acosh asin asinh atan atanh cbrt ceil cos
     cosh erf erfc exp exp10 exp2 expm1 fabs floor gamma j0 j1 lgamma log  log10
     log1p  log2  logb	nearbyint  rint round significand sin sinh sqrt tan tanh
     tgamma trunc y0 y1.

     Two-input C math functions: atan2 copysign drem fdim fmax fmin  fmod  frexp
     hypot jn ldexp modf nextafter nexttoward pow remainder scalb scalbln yn.

     Three-input C math functions: fma.

     See your system's manual for more information on each of these.

I/O
     At  this time jq has minimal support for I/O, mostly in the form of control
     over when inputs are read. Two builtins functions are  provided  for  this,
     input and inputs, that read from the same sources (e.g., stdin, files named
     on the command-line) as jq itself. These two builtins, and jq's own reading
     actions, can be interleaved with each other. They are commonly used in com-
     bination with the null input option -n to prevent one input from being read
     implicitly.

     Two  builtins  provide minimal output capabilities, debug, and stderr. (Re-
     call that a jq program's output values are always output as JSON  texts  on
     stdout.)  The debug builtin can have application-specific behavior, such as
     for executables that use the libjq C API but aren't the jq  executable  it-
     self. The stderr builtin outputs its input in raw mode to stder with no ad-
     ditional decoration, not even a newline.

     Most  jq builtins are referentially transparent, and yield constant and re-
     peatable value streams when applied to constant inputs. This is not true of
     I/O builtins.

   input
     Outputs one new input.

     Note that when using input it is generally necessary to invoke jq with  the
     -n command-line option, otherwise the first entity will be lost.

	 echo 1 2 3 4 | jq '[., input]' # [1,2] [3,4]

   inputs
     Outputs all remaining inputs, one by one.

     This  is primarily useful for reductions over a program's inputs. Note that
     when using inputs it is generally necessary to invoke jq with the	-n  com-
     mand-line option, otherwise the first entity will be lost.

	 echo 1 2 3 | jq -n 'reduce inputs as $i (0; . + $i)' # 6

   debug, debug(msgs)
     These  two  filters  are like . but have as a side-effect the production of
     one or more messages on stderr.

     The message produced by the debug filter has the form

	 ["DEBUG:",<input-value>]

     where <input-value> is a compact rendition of the input value. This  format
     may change in the future.

     The  debug(msgs) filter is defined as (msgs | debug | empty), . thus allow-
     ing great flexibility in the content of the message,  while  also	allowing
     multi-line debugging statements to be created.

     For example, the expression:

	 1 as $x | 2 | debug("Entering function foo with $x == \($x)", .) | (.+1)

     would produce the value 3 but with the following two lines being written to
     stderr:

	 ["DEBUG:","Entering function foo with $x == 1"]
	 ["DEBUG:",2]

   stderr
     Prints its input in raw and compact mode to stderr with no additional deco-
     ration, not even a newline.

   input_filename
     Returns  the name of the file whose input is currently being filtered. Note
     that this will not work well unless jq is running in a UTF-8 locale.

   input_line_number
     Returns the line number of the input currently being filtered.

STREAMING
     With the --stream option jq can parse input texts in a  streaming	fashion,
     allowing  jq  programs  to  start	processing  large JSON texts immediately
     rather than after the parse completes. If you have a single JSON text  that
     is  1GB  in  size,  streaming  it	will  allow  you to process it much more
     quickly.

     However, streaming isn't easy to deal with as  the  jq  program  will  have
     [<path>, <leaf-value>] (and a few other forms) as inputs.

     Several builtins are provided to make handling streams easier.

     The  examples  below  use	the  streamed  form  of  ["a",["b"]],  which  is
     [[0],"a"],[[1,0],"b"],[[1,0]],[[1]].

     Streaming forms include [<path>,  <leaf-value>]  (to  indicate  any  scalar
     value,  empty array, or empty object), and [<path>] (to indicate the end of
     an array or object). Future versions of jq run with --stream and --seq  may
     output  additional forms such as ["error message"] when an input text fails
     to parse.

   truncate_stream(stream_expression)
     Consumes a number as input and truncates the corresponding number	of  path
     elements from the left of the outputs of the given streaming expression.

	 jq 'truncate_stream([[0],"a"],[[1,0],"b"],[[1,0]],[[1]])'
	    1
	 => [[0],"b"], [[0]]

   fromstream(stream_expression)
     Outputs values corresponding to the stream expression's outputs.

	 jq 'fromstream(1|truncate_stream([[0],"a"],[[1,0],"b"],[[1,0]],[[1]]))'
	    null
	 => ["b"]

   tostream
     The tostream builtin outputs the streamed form of its input.

	 jq '. as $dot|fromstream($dot|tostream)|.==$dot'
	    [0,[1,{"a":1},{"b":2}]]
	 => true

ASSIGNMENT
     Assignment  works	a little differently in jq than in most programming lan-
     guages. jq doesn't distinguish between references to and  copies  of  some-
     thing  -  two  objects or arrays are either equal or not equal, without any
     further notion of being "the same object" or "not the same object".

     If an object has two fields which are arrays, .foo and .bar, and you append
     something to .foo, then .bar will not get bigger, even if you've previously
     set .bar = .foo. If you're used to programming in	languages  like  Python,
     Java,  Ruby,  JavaScript, etc. then you can think of it as though jq does a
     full deep copy of every object before it does the assignment  (for  perfor-
     mance it doesn't actually do that, but that's the general idea).

     This  means that it's impossible to build circular values in jq (such as an
     array whose first element is itself). This is quite  intentional,	and  en-
     sures that anything a jq program can produce can be represented in JSON.

     All  the  assignment operators in jq have path expressions on the left-hand
     side (LHS). The right-hand side (RHS) provides values to set to  the  paths
     named by the LHS path expressions.

     Values  in jq are always immutable. Internally, assignment works by using a
     reduction to compute new, replacement values for . that have  had	all  the
     desired  assignments applied to ., then outputting the modified value. This
     might be made clear by this example: {a:{b:{c:1}}}  |  (.a.b|=3),	..  This
     will  output {"a":{"b":3}} and {"a":{"b":{"c":1}}} because the last sub-ex-
     pression, ., sees the original value, not the modified value.

     Most users will want to use modification assignment operators, such  as  |=
     or +=, rather than =.

     Note  that  the  LHS  of  assignment operators refers to a value in .. Thus
     $var.foo = 1 won't work as expected ($var.foo is not a valid or useful path
     expression in .); use $var | .foo = 1 instead.

     Note too that .a,.b=0 does not set .a and .b, but (.a,.b)=0 sets both.

   Update-assignment: |=
     This is the "update" operator |=. It takes a filter on the right-hand  side
     and works out the new value for the property of . being assigned to by run-
     ning  the	old value through this expression. For instance, (.foo, .bar) |=
     .+1 will build an object with the foo field set to the input's foo plus  1,
     and the bar field set to the input's bar plus 1.

     The left-hand side can be any general path expression; see path().

     Note that the left-hand side of |= refers to a value in .. Thus $var.foo |=
     .	+  1  won't work as expected ($var.foo is not a valid or useful path ex-
     pression in .); use $var | .foo |= . + 1 instead.

     If the right-hand side outputs no values (i.e., empty), then the  left-hand
     side path will be deleted, as with del(path).

     If  the right-hand side outputs multiple values, only the first one will be
     used (COMPATIBILITY NOTE: in jq 1.5 and earlier releases,	it  used  to  be
     that only the last one was used).

	 jq '(..|select(type=="boolean")) |= if . then 1 else 0 end'
	    [true,false,[5,true,[true,[false]],false]]
	 => [1,0,[5,1,[1,[0]],0]]

   Arithmetic update-assignment: +=, -=, *=, /=, %=, //=
     jq  has  a few operators of the form a op= b, which are all equivalent to a
     |= . op b. So, += 1 can be used to increment values, being the same as |= .
     + 1.

	 jq '.foo += 1'
	    {"foo": 42}
	 => {"foo": 43}

   Plain assignment: =
     This is the plain assignment operator. Unlike the others, the input to  the
     right-hand  side (RHS) is the same as the input to the left-hand side (LHS)
     rather than the value at the LHS path, and all values  output  by	the  RHS
     will be used (as shown below).

     If  the RHS of = produces multiple values, then for each such value jq will
     set the paths on the left-hand side to the value and then	it  will  output
     the modified .. For example, (.a,.b) = range(2) outputs {"a":0,"b":0}, then
     {"a":1,"b":1}. The "update" assignment forms (see above) do not do this.

     This example should show the difference between = and |=:

     Provide input {"a": {"b": 10}, "b": 20} to the programs

	 .a = .b

     and

	 .a |= .b

     The  former  will set the a field of the input to the b field of the input,
     and produce the output {"a": 20, "b": 20}. The latter will set the a  field
     of the input to the a field's b field, producing {"a": 10, "b": 20}.

	 jq '.a = .b'
	    {"a": {"b": 10}, "b": 20}
	 => {"a":20,"b":20}

	 jq '.a |= .b'
	    {"a": {"b": 10}, "b": 20}
	 => {"a":10,"b":20}

	 jq '(.a, .b) = range(3)'
	    null
	 => {"a":0,"b":0}, {"a":1,"b":1}, {"a":2,"b":2}

	 jq '(.a, .b) |= range(3)'
	    null
	 => {"a":0,"b":0}

   Complex assignments
     Lots  more things are allowed on the left-hand side of a jq assignment than
     in most languages. We've already seen simple field  accesses  on  the  left
     hand side, and it's no surprise that array accesses work just as well:

	 .posts[0].title = "JQ Manual"

     What  may come as a surprise is that the expression on the left may produce
     multiple results, referring to different points in the input document:

	 .posts[].comments |= . + ["this is great"]

     That example appends the string "this is great" to the "comments" array  of
     each  post  in the input (where the input is an object with a field "posts"
     which is an array of posts).

     When jq encounters an assignment like 'a = b', it records the "path"  taken
     to select a part of the input document while executing a. This path is then
     used  to find which part of the input to change while executing the assign-
     ment. Any filter may be used on the left-hand side of an equals - whichever
     paths it selects from the input will be where the assignment is performed.

     This is a very powerful operation. Suppose we wanted to add  a  comment  to
     blog  posts,  using the same "blog" input above. This time, we only want to
     comment on the posts written by "stedolan". We can find those  posts  using
     the "select" function described earlier:

	 .posts[] | select(.author == "stedolan")

     The  paths  provided  by  this  operation	point  to each of the posts that
     "stedolan" wrote, and we can comment on each of them in the same  way  that
     we did before:

	 (.posts[] | select(.author == "stedolan") | .comments) |=
	     . + ["terrible."]

COMMENTS
     You can write comments in your jq filters using #.

     A	# character (not part of a string) starts a comment. All characters from
     # to the end of the line are ignored.

     If the end of the line is preceded by an odd number  of  backslash  charac-
     ters,  the following line is also considered part of the comment and is ig-
     nored.

     For example, the following code outputs [1,3,4,7]

	 [
	   1,
	   # foo \
	   2,
	   # bar \\
	   3,
	   4, # baz \\\
	   5, \
	   6,
	   7
	   # comment \
	     comment \
	     comment
	 ]

     Backslash continuing the comment on the next line can be useful when  writ-
     ing the "shebang" for a jq script:

	 #!/bin/sh --
	 # total - Output the sum of the given arguments (or stdin)
	 # usage: total [numbers...]
	 # \
	 exec jq --args -MRnf -- "$0" "$@"

	 $ARGS.positional |
	 reduce (
	   if . == []
	     then inputs
	     else .[]
	   end |
	   . as $dot |
	   try tonumber catch false |
	   if not or isnan then
	     @json "total: Invalid number \($dot).\n" | halt_error(1)
	   end
	 ) as $n (0; . + $n)

     The  exec	line  is considered a comment by jq, so it is ignored. But it is
     not ignored by sh, since in sh a backslash at the end of the line does  not
     continue  the comment. With this trick, when the script is invoked as total
     1 2, /bin/sh -- /path/to/total 1 2 will be run, and sh will then  run  exec
     jq  --args  -MRnf	--  /path/to/total 1 2 replacing itself with a jq inter-
     preter invoked with the specified options (-M, -R, -n, --args), that evalu-
     ates the current file ($0), with the arguments ($@) that were passed to sh.

MODULES
     jq has a library/module system. Modules are files whose names end in .jq.

     Modules imported by a program are searched for in	a  default  search  path
     (see  below). The import and include directives allow the importer to alter
     this path.

     Paths in the search path are subject to various substitutions.

     For paths starting with ~/, the user's home directory is substituted for ~.

     For paths starting with $ORIGIN/, the directory where the jq executable  is
     located is substituted for $ORIGIN.

     For  paths  starting with ./ or paths that are ., the path of the including
     file is substituted for  ..  For  top-level  programs  given  on  the  com-
     mand-line, the current directory is used.

     Import directives can optionally specify a search path to which the default
     is appended.

     The default search path is the search path given to the -L command-line op-
     tion, else ["~/.jq", "$ORIGIN/../lib/jq", "$ORIGIN/../lib"].

     Null and empty string path elements terminate search path processing.

     A dependency with relative path foo/bar would be searched for in foo/bar.jq
     and foo/bar/bar.jq in the given search path. This is intended to allow mod-
     ules  to  be placed in a directory along with, for example, version control
     files, README files, and so on, but also to allow for single-file modules.

     Consecutive components with the same name are not allowed to avoid ambigui-
     ties (e.g., foo/foo).

     For example, with -L$HOME/.jq a module foo can be found in $HOME/.jq/foo.jq
     and $HOME/.jq/foo/foo.jq.

     If .jq exists in the user's home directory, and is a  file  (not  a  direc-
     tory), it is automatically sourced into the main program.

   import RelativePathString as NAME [<metadata>];
     Imports  a  module  found	at  the  given path relative to a directory in a
     search path. A .jq suffix will be added to the relative  path  string.  The
     module's symbols are prefixed with NAME::.

     The optional metadata must be a constant jq expression. It should be an ob-
     ject  with  keys  like  homepage  and  so on. At this time jq only uses the
     search key/value of the metadata. The metadata is also  made  available  to
     users via the modulemeta builtin.

     The  search  key in the metadata, if present, should have a string or array
     value (array of strings); this is the search path to  be  prefixed  to  the
     top-level search path.

   include RelativePathString [<metadata>];
     Imports  a  module  found	at  the  given path relative to a directory in a
     search path as if it were included in place. A .jq suffix will be added  to
     the  relative  path  string.  The	module's  symbols  are imported into the
     caller's namespace as if the module's content had been included directly.

     The optional metadata must be a constant jq expression. It should be an ob-
     ject with keys like homepage and so on. At  this  time  jq  only  uses  the
     search  key/value	of  the metadata. The metadata is also made available to
     users via the modulemeta builtin.

   import RelativePathString as $NAME [<metadata>];
     Imports a JSON file found at the given path relative to a	directory  in  a
     search  path. A .json suffix will be added to the relative path string. The
     file's data will be available as $NAME::NAME.

     The optional metadata must be a constant jq expression. It should be an ob-
     ject with keys like homepage and so on. At  this  time  jq  only  uses  the
     search  key/value	of  the metadata. The metadata is also made available to
     users via the modulemeta builtin.

     The search key in the metadata, if present, should have a string  or  array
     value  (array  of	strings);  this is the search path to be prefixed to the
     top-level search path.

   module <metadata>;
     This directive is entirely optional. It's not required  for  proper  opera-
     tion.  It	serves	only  the purpose of providing metadata that can be read
     with the modulemeta builtin.

     The metadata must be a constant jq expression. It should be an object  with
     keys  like  homepage.  At this time jq doesn't use this metadata, but it is
     made available to users via the modulemeta builtin.

   modulemeta
     Takes a module name as input and outputs the module's metadata  as  an  ob-
     ject,  with the module's imports (including metadata) as an array value for
     the deps key and the module's defined functions as an array value	for  the
     defs key.

     Programs  can  use this to query a module's metadata, which they could then
     use to, for example, search for, download, and  install  missing  dependen-
     cies.

COLORS
     To configure alternative colors just set the JQ_COLORS environment variable
     to  colon-delimited  list of partial terminal escape sequences like "1;31",
     in this order:

     *	 color for null

     *	 color for false

     *	 color for true

     *	 color for numbers

     *	 color for strings

     *	 color for arrays

     *	 color for objects

     *	 color for object keys

     The   default   color   scheme   is   the	 same	as    setting	 JQ_COL-
     ORS="0;90:0;39:0;39:0;39:0;32:1;39:1;39:1;34".

     This  is  not a manual for VT100/ANSI escapes. However, each of these color
     specifications should consist of two numbers  separated  by  a  semi-colon,
     where the first number is one of these:

     *	 1 (bright)

     *	 2 (dim)

     *	 4 (underscore)

     *	 5 (blink)

     *	 7 (reverse)

     *	 8 (hidden)

     and the second is one of these:

     *	 30 (black)

     *	 31 (red)

     *	 32 (green)

     *	 33 (yellow)

     *	 34 (blue)

     *	 35 (magenta)

     *	 36 (cyan)

     *	 37 (white)

BUGS
     Presumably. Report them or discuss them at:

	 https://github.com/jqlang/jq/issues

AUTHOR
     Stephen Dolan <mu@netsoc.tcd.ie>

				    May 2025				   JQ(1)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=jq&sektion=1&manpath=FreeBSD+15.1-RELEASE+and+Ports>

home | help