Skip to content

Advanced Usage ​

Pretty print JSON without starting the interactive mode:

sh
echo '{"name": "world"}' | fx .

Syntactic Sugar ​

Mapping ​

Use @ to map. Prefix your expression with @ and fx will run it for each item.

sh
fx example.json @.title

This is the short form of:

sh
fx example.json '.map(x => x.title)'

You can also use functions with @ symbol.

sh
fx example.json @keys

TIP

Fx also supports .[] syntax. The [] operator is shorthand for .flatMap(x => x).

sh
fx example.json '.[].issues[].title'

This is the short form of:

sh
fx example.json '.flatMap(x => x.issues.flatMap(x => x.title))

Filtering ​

Use ? to filter. Prefix your expression with ? and fx will filter the array.

sh
fx example.json '?.size_bytes >= 1024'

This is the short form of:

sh
fx example.json '.filter(x => x.size_bytes >= 1024)'

Edit-in-place ​

Use the spread operator to modify the input:

sh
echo '{"count": 1}' | fx '{...x, count: x.count + 1}'
output
{ "count": 2 }

Or to modify nested objects, use the comma (,) operator:

sh
fx example.json '.owner.login = "me", x'

INFO

The , operator is a JavaScript feature that evaluates each of its operands (from left to right) and returns the value of the last operand.

Use the save function to save the modified input:

sh
fx example.json 'x.name = x.name.toUpperCase(), x' save

Now the edited data will be saved to the same example.json file.

Big Integers ​

If a number is bigger than 253 – 1 (max safe integer in JS), fx will parse it as BigInt. To work with BigInts in JavaScript, use the n suffix:

sh
echo '{"count": 1234567890987654321}' | fx '.count + 1n'
output
1234567890987654322

Infinity and NaN ​

fx will parse Infinity and NaN as is. Those values are not valid JSON, but they are valid values in JavaScript. Supported values are Infinity, -Infinity, INF, -INF, NaN, nan.

sh
echo '{"count": Infinity}' | fx '.count + 1'
output
Infinity

TIP

Use the --strict flag to throw an error on invalid JSON.

sh
echo '{"count": Infinity}' | fx --strict

Results in an error:

output
Unexpected character 'I' on line 1.

  {"count": Infinity}
  ..........^

Non-JSON Data ​

For non-JSON content, use the --raw or -r flag:

sh
ls | fx -r '[x, x.includes(".md")]'
output
[ "node_modules", false ]
[ "src", false ]
[ "readme.md", true ]
[ "license.md", true ]

Combine --raw and --slurp (or -rs) to process as a single string array:

sh
ls | fx -rs '.filter(x => x.includes(".md"))'
output
[ "readme.md", "license.md" ]

Use the skip symbol to skip printing certain results:

sh
ls | fx -r '.includes(".md") ? this : skip'
output
readme.md
license.md

Use the list function to print an array as a list:

sh
ls | fx -rs '.filter(x => x.includes(".md"))' list
output
readme.md
license.md

.fxrc.js ​

fx can recognize the .fxrc.js file, either in the current directory, the home directory, or the XDG config directory.

Here's how you can define custom functions:

js
function addOne(x) {
  return x + 1
}

Invoke your custom function in fx:

sh
echo '1' | fx addOne
output
2