* Function eXecution
Command-line JSON processing tool
- Don't need to learn new syntax
- Plain JavaScript
- Formatting and highlighting
- Standalone binary
- Interactive mode ๐
$ npm install -g fx
Or download standalone binary from releases page.
Pipe into fx
any JSON and anonymous function for reducing it.
$ echo '{...}' | fx [code ...]
Start interactive mode without passing any arguments:
$ curl ... | fx
Use an anonymous function as reducer which gets JSON and processes it:
$ echo '{"foo": [{"bar": "value"}]}' | fx 'x => x.foo[0].bar'
value
If you don't pass anonymous function param => ...
, code will be automatically transformed into anonymous function.
And you can get access to JSON by this
keyword:
$ echo '{"foo": [{"bar": "value"}]}' | fx 'this.foo[0].bar'
value
It is possible to omit this
keyword:
$ echo '{"foo": [{"bar": "value"}]}' | fx .foo[0].bar
value
If single dot is passed, JSON will be processed without modification:
$ echo '{"foo": "bar"}' | fx .
{
"foo": "bar"
}
You can pass any number of anonymous functions for reducing JSON:
$ echo '{"foo": [{"bar": "value"}]}' | fx 'x => x.foo' 'this[0]' 'this.bar'
value
If passed code contains yield
keyword, generator expression
will be used:
$ curl ... | fx 'for (let user of this) if (user.login.startsWith("a")) yield user'
Access to JSON through this
keyword:
$ echo '["a", "b"]' | fx 'yield* this'
[
"a",
"b"
]
$ echo '["a", "b"]' | fx 'yield* this; yield "c";'
[
"a",
"b",
"c"
]
You can update existing JSON using spread operator:
$ echo '{"count": 0}' | fx '{...this, count: 1}'
{
"count": 1
}
Use any npm package by installing it globally:
$ npm install -g lodash
$ cat package.json | fx 'require("lodash").keys(this.dependencies)'
If you need something different then JSON (for example arguments for xargs) do not return anything from reducer.
undefined
value printed into stderr by default.
echo '[]' | fx 'void 0'
undefined
echo '[1,2,3]' | fx 'this.forEach(x => console.log(x))' 2>/dev/null | xargs echo
1 2 3
Convert object to array:
$ cat package.json | fx 'Object.keys(this.dependencies)'
[
"@medv/prettyjson"
]
By the way, fx has shortcut for Object.keys(this)
. Previous example can be rewritten as:
$ cat package.json | fx this.dependencies ?
Start interactive mode without passing any arguments:
$ curl ... | fx
Click on fields to expand or collapse JSON tree, use mouse wheel to scroll view.
Next commands available in interactive mode:
Key | Command |
---|---|
q or Esc or Ctrl +c |
Exit |
e /E |
Expand/Collapse all |
up /down or k /j |
Scroll up/down one line |
g /G |
Goto top/bottom |
You may found what you can't just select text in fx. This is due the fact that all mouse events redirected to stdin. To be able select again you need instruct your terminal not to do it. This can be done by holding special keys while selecting:
Key | Terminal |
---|---|
Option +Mouse |
iTerm2 |
Fn +Mouse |
terminal.app |
- jq โ cli JSON processor on C
- jl โ functional sed for JSON on Haskell
- xx โ
fx
-like JSON tool (go) - ymlx -
fx
-like YAML cli processor - jv โ interactive JSON viewer (go)
- jid โ interactive cli tool based on jq (go)
MIT