mirror of
https://github.com/wader/fq.git
synced 2024-11-23 00:57:15 +03:00
doc,help: Nicer format help and move help tests into each format
Also add authors to avro and macho decoders Generated with: for i in $(go run . -r -n '_registry | [([([.files[][].name | split(".")[0]] | unique[]), (.formats[].name)] | count[] | select(.[1] == 2)[0]), (.formats[] | select(.decode_in_arg).name)] | unique[]'); do DIR=$(dirname $(find format -name $i.go)); echo "$ fq -h $i" > "$DIR/testdata/help_$i.fqtest" ; done
This commit is contained in:
parent
2e3d71fdcc
commit
a7a101ca67
@ -162,7 +162,7 @@ Supports decoding BER, CER and DER (X.690).
|
|||||||
- Does not support specifying a schema.
|
- Does not support specifying a schema.
|
||||||
- Supports `torepr` but without schema all sequences and sets will be arrays.
|
- Supports `torepr` but without schema all sequences and sets will be arrays.
|
||||||
|
|
||||||
### `frompem` can be used to decode certificates etc
|
### Can be used to decode certificates etc
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
$ fq -d raw 'frompem | asn1_ber | d' cert.pem
|
$ fq -d raw 'frompem | asn1_ber | d' cert.pem
|
||||||
@ -220,6 +220,11 @@ Limitations:
|
|||||||
### References
|
### References
|
||||||
- https://avro.apache.org/docs/current/spec.html#Object+Container+Files
|
- https://avro.apache.org/docs/current/spec.html#Object+Container+Files
|
||||||
|
|
||||||
|
### Authors
|
||||||
|
- Xentripetal
|
||||||
|
xentripetal@fastmail.com
|
||||||
|
[@xentripetal](https://github.com/xentripetal)
|
||||||
|
|
||||||
## bencode
|
## bencode
|
||||||
|
|
||||||
### Convert represented value to JSON
|
### Convert represented value to JSON
|
||||||
@ -428,14 +433,10 @@ $ '<a href="url">text</a>' | fq -d html -o array=true
|
|||||||
]
|
]
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
```
|
|
||||||
|
|
||||||
```sh
|
# decode html files to a {file: "title", ...} object
|
||||||
# Decode html files to a {file: "title", ...} object
|
|
||||||
$ fq -n -d html '[inputs | {key: input_filename, value: .html.head.title?}] | from_entries' *.html
|
$ fq -n -d html '[inputs | {key: input_filename, value: .html.head.title?}] | from_entries' *.html
|
||||||
```
|
|
||||||
|
|
||||||
```sh
|
|
||||||
# <a> href:s in file
|
# <a> href:s in file
|
||||||
$ fq -r -o array=true -d html '.. | select(.[0] == "a" and .[1].href)?.[1].href' file.html
|
$ fq -r -o array=true -d html '.. | select(.[0] == "a" and .[1].href)?.[1].href' file.html
|
||||||
```
|
```
|
||||||
@ -453,15 +454,20 @@ $ fq '.load_commands[] | select(.cmd=="segment_64")' file
|
|||||||
### References
|
### References
|
||||||
- https://github.com/aidansteele/osx-abi-macho-file-format-reference
|
- https://github.com/aidansteele/osx-abi-macho-file-format-reference
|
||||||
|
|
||||||
|
### Authors
|
||||||
|
- Sıddık AÇIL
|
||||||
|
acils@itu.edu.tr
|
||||||
|
[@Akaame](https://github.com/Akaame)
|
||||||
|
|
||||||
## matroska
|
## matroska
|
||||||
|
|
||||||
### Lookup element path using `matroska_path`
|
### Lookup element using path
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
$ fq 'matroska_path(".Segment.Tracks[0)")' file.mkv
|
$ fq 'matroska_path(".Segment.Tracks[0)")' file.mkv
|
||||||
```
|
```
|
||||||
|
|
||||||
### Get element path using `matroska_path`
|
### Get path to element
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
$ fq 'grep_by(.id == "Tracks") | matroska_path' file.mkv
|
$ fq 'grep_by(.id == "Tracks") | matroska_path' file.mkv
|
||||||
@ -516,14 +522,14 @@ Decode value as mp4
|
|||||||
... | mp4({allow_truncated:false,decode_samples:true})
|
... | mp4({allow_truncated:false,decode_samples:true})
|
||||||
```
|
```
|
||||||
|
|
||||||
### `mp4_path($path)` - Lookup mp4 box using a mp4 box path.
|
### Lookup mp4 box using a mp4 box path.
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
# <decode value box> | mp4_path($path) -> <decode value box>
|
# <decode value box> | mp4_path($path) -> <decode value box>
|
||||||
$ fq 'mp4_path(".moov.trak[1]")' file.mp4
|
$ fq 'mp4_path(".moov.trak[1]")' file.mp4
|
||||||
```
|
```
|
||||||
|
|
||||||
### `mp4_path` - Return mp4 box path for a decode value box.
|
### Get mp4 box path for a decode value box.
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
# <decode value box> | mp4_path -> string
|
# <decode value box> | mp4_path -> string
|
||||||
@ -536,9 +542,10 @@ $ fq 'grep_by(.type == "trak") | mp4_path' file.mp4
|
|||||||
$ fq -n '"AAAAHGVsc3QAAAAAAAAAAQAAADIAAAQAAAEAAA==" | frombase64 | mp4({force:true}) | d'
|
$ fq -n '"AAAAHGVsc3QAAAAAAAAAAQAAADIAAAQAAAEAAA==" | frombase64 | mp4({force:true}) | d'
|
||||||
```
|
```
|
||||||
|
|
||||||
### Don't decode samples and manually decode first sample for first track as a `aac_frame`
|
### Speed up decoding by not decoding samples
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
|
# manually decode first sample as a aac_frame
|
||||||
$ fq -o decode_samples=false '.tracks[0].samples[0] | aac_frame | d' file.mp4
|
$ fq -o decode_samples=false '.tracks[0].samples[0] | aac_frame | d' file.mp4
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -671,9 +678,7 @@ $ echo '<a><b/><b>bbb</b><c attr="value">ccc</c></a>' | fq -d xml -o seq=true
|
|||||||
# access text of the <c> element
|
# access text of the <c> element
|
||||||
$ echo '<a><b/><b>bbb</b><c attr="value">ccc</c></a>' | fq '.a.c["#text"]'
|
$ echo '<a><b/><b>bbb</b><c attr="value">ccc</c></a>' | fq '.a.c["#text"]'
|
||||||
"ccc"
|
"ccc"
|
||||||
```
|
|
||||||
|
|
||||||
```sh
|
|
||||||
# decode to object and encode to xml
|
# decode to object and encode to xml
|
||||||
$ echo '<a><b/><b>bbb</b><c attr="value">ccc</c></a>' | fq -r -d xml -o seq=true 'toxml({indent:2})'
|
$ echo '<a><b/><b>bbb</b><c attr="value">ccc</c></a>' | fq -r -d xml -o seq=true 'toxml({indent:2})'
|
||||||
<a>
|
<a>
|
||||||
@ -716,11 +721,9 @@ Elements are arrays of the shape `["#text": "body text", "attr_name", {key: "att
|
|||||||
]
|
]
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
```
|
|
||||||
|
|
||||||
```sh
|
|
||||||
# decode to array and encode to xml
|
# decode to array and encode to xml
|
||||||
✗ echo '<a><b/><b>bbb</b><c attr="value">ccc</c></a>' | fq -r -d xml -o array=true -o seq=true 'toxml({indent:2})'
|
$ echo '<a><b/><b>bbb</b><c attr="value">ccc</c></a>' | fq -r -d xml -o array=true -o seq=true 'toxml({indent:2})'
|
||||||
<a>
|
<a>
|
||||||
<b></b>
|
<b></b>
|
||||||
<b>bbb</b>
|
<b>bbb</b>
|
||||||
|
452
doc/formats.svg
452
doc/formats.svg
File diff suppressed because it is too large
Load Diff
Before Width: | Height: | Size: 133 KiB After Width: | Height: | Size: 135 KiB |
@ -32,3 +32,111 @@ $ fq -n _registry.groups.probe
|
|||||||
"xml",
|
"xml",
|
||||||
"yaml"
|
"yaml"
|
||||||
]
|
]
|
||||||
|
$ fq --help formats
|
||||||
|
aac_frame Advanced Audio Coding frame
|
||||||
|
adts Audio Data Transport Stream
|
||||||
|
adts_frame Audio Data Transport Stream frame
|
||||||
|
amf0 Action Message Format 0
|
||||||
|
apev2 APEv2 metadata tag
|
||||||
|
ar Unix archive
|
||||||
|
asn1_ber ASN1 BER (basic encoding rules, also CER and DER)
|
||||||
|
av1_ccr AV1 Codec Configuration Record
|
||||||
|
av1_frame AV1 frame
|
||||||
|
av1_obu AV1 Open Bitstream Unit
|
||||||
|
avc_annexb H.264/AVC Annex B
|
||||||
|
avc_au H.264/AVC Access Unit
|
||||||
|
avc_dcr H.264/AVC Decoder Configuration Record
|
||||||
|
avc_nalu H.264/AVC Network Access Layer Unit
|
||||||
|
avc_pps H.264/AVC Picture Parameter Set
|
||||||
|
avc_sei H.264/AVC Supplemental Enhancement Information
|
||||||
|
avc_sps H.264/AVC Sequence Parameter Set
|
||||||
|
avro_ocf Avro object container file
|
||||||
|
bencode BitTorrent bencoding
|
||||||
|
bitcoin_blkdat Bitcoin blk.dat
|
||||||
|
bitcoin_block Bitcoin block
|
||||||
|
bitcoin_script Bitcoin script
|
||||||
|
bitcoin_transaction Bitcoin transaction
|
||||||
|
bsd_loopback_frame BSD loopback frame
|
||||||
|
bson Binary JSON
|
||||||
|
bzip2 bzip2 compression
|
||||||
|
cbor Concise Binary Object Representation
|
||||||
|
csv Comma separated values
|
||||||
|
dns DNS packet
|
||||||
|
dns_tcp DNS packet (TCP)
|
||||||
|
elf Executable and Linkable Format
|
||||||
|
ether8023_frame Ethernet 802.3 frame
|
||||||
|
exif Exchangeable Image File Format
|
||||||
|
fairplay_spc FairPlay Server Playback Context
|
||||||
|
flac Free Lossless Audio Codec file
|
||||||
|
flac_frame FLAC frame
|
||||||
|
flac_metadatablock FLAC metadatablock
|
||||||
|
flac_metadatablocks FLAC metadatablocks
|
||||||
|
flac_picture FLAC metadatablock picture
|
||||||
|
flac_streaminfo FLAC streaminfo
|
||||||
|
gif Graphics Interchange Format
|
||||||
|
gzip gzip compression
|
||||||
|
hevc_annexb H.265/HEVC Annex B
|
||||||
|
hevc_au H.265/HEVC Access Unit
|
||||||
|
hevc_dcr H.265/HEVC Decoder Configuration Record
|
||||||
|
hevc_nalu H.265/HEVC Network Access Layer Unit
|
||||||
|
hevc_pps H.265/HEVC Picture Parameter Set
|
||||||
|
hevc_sps H.265/HEVC Sequence Parameter Set
|
||||||
|
hevc_vps H.265/HEVC Video Parameter Set
|
||||||
|
html HyperText Markup Language
|
||||||
|
icc_profile International Color Consortium profile
|
||||||
|
icmp Internet Control Message Protocol
|
||||||
|
icmpv6 Internet Control Message Protocol v6
|
||||||
|
id3v1 ID3v1 metadata
|
||||||
|
id3v11 ID3v1.1 metadata
|
||||||
|
id3v2 ID3v2 metadata
|
||||||
|
ipv4_packet Internet protocol v4 packet
|
||||||
|
ipv6_packet Internet protocol v6 packet
|
||||||
|
jpeg Joint Photographic Experts Group file
|
||||||
|
json JavaScript Object Notation
|
||||||
|
jsonl JavaScript Object Notation Lines
|
||||||
|
macho Mach-O macOS executable
|
||||||
|
macho_fat Fat Mach-O macOS executable (multi-architecture)
|
||||||
|
markdown Markdown
|
||||||
|
matroska Matroska file
|
||||||
|
mp3 MP3 file
|
||||||
|
mp3_frame MPEG audio layer 3 frame
|
||||||
|
mp4 ISOBMFF, QuickTime and similar
|
||||||
|
mpeg_asc MPEG-4 Audio Specific Config
|
||||||
|
mpeg_es MPEG Elementary Stream
|
||||||
|
mpeg_pes MPEG Packetized elementary stream
|
||||||
|
mpeg_pes_packet MPEG Packetized elementary stream packet
|
||||||
|
mpeg_spu Sub Picture Unit (DVD subtitle)
|
||||||
|
mpeg_ts MPEG Transport Stream
|
||||||
|
msgpack MessagePack
|
||||||
|
ogg OGG file
|
||||||
|
ogg_page OGG page
|
||||||
|
opus_packet Opus packet
|
||||||
|
pcap PCAP packet capture
|
||||||
|
pcapng PCAPNG packet capture
|
||||||
|
png Portable Network Graphics file
|
||||||
|
prores_frame Apple ProRes frame
|
||||||
|
protobuf Protobuf
|
||||||
|
protobuf_widevine Widevine protobuf
|
||||||
|
pssh_playready PlayReady PSSH
|
||||||
|
raw Raw bits
|
||||||
|
rtmp Real-Time Messaging Protocol
|
||||||
|
sll2_packet Linux cooked capture encapsulation v2
|
||||||
|
sll_packet Linux cooked capture encapsulation
|
||||||
|
tar Tar archive
|
||||||
|
tcp_segment Transmission control protocol segment
|
||||||
|
tiff Tag Image File Format
|
||||||
|
toml Tom's Obvious, Minimal Language
|
||||||
|
udp_datagram User datagram protocol
|
||||||
|
vorbis_comment Vorbis comment
|
||||||
|
vorbis_packet Vorbis packet
|
||||||
|
vp8_frame VP8 frame
|
||||||
|
vp9_cfm VP9 Codec Feature Metadata
|
||||||
|
vp9_frame VP9 frame
|
||||||
|
vpx_ccr VPX Codec Configuration Record
|
||||||
|
wasm WebAssembly Binary Format
|
||||||
|
wav WAV file
|
||||||
|
webp WebP image
|
||||||
|
xing Xing header
|
||||||
|
xml Extensible Markup Language
|
||||||
|
yaml YAML Ain't Markup Language
|
||||||
|
zip ZIP archive
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -4,7 +4,7 @@ Supports decoding BER, CER and DER (X.690).
|
|||||||
- Does not support specifying a schema.
|
- Does not support specifying a schema.
|
||||||
- Supports `torepr` but without schema all sequences and sets will be arrays.
|
- Supports `torepr` but without schema all sequences and sets will be arrays.
|
||||||
|
|
||||||
### `frompem` can be used to decode certificates etc
|
### Can be used to decode certificates etc
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
$ fq -d raw 'frompem | asn1_ber | d' cert.pem
|
$ fq -d raw 'frompem | asn1_ber | d' cert.pem
|
||||||
|
39
format/asn1/testdata/help_asn1_ber.fqtest
vendored
Normal file
39
format/asn1/testdata/help_asn1_ber.fqtest
vendored
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
$ fq -h asn1_ber
|
||||||
|
asn1_ber: ASN1 BER (basic encoding rules, also CER and DER) decoder
|
||||||
|
|
||||||
|
Decode examples
|
||||||
|
===============
|
||||||
|
|
||||||
|
# Decode file as asn1_ber
|
||||||
|
$ fq -d asn1_ber . file
|
||||||
|
# Decode value as asn1_ber
|
||||||
|
... | asn1_ber
|
||||||
|
|
||||||
|
Supports decoding BER, CER and DER (X.690).
|
||||||
|
|
||||||
|
- Currently no extra validation is done for CER and DER.
|
||||||
|
- Does not support specifying a schema.
|
||||||
|
- Supports torepr but without schema all sequences and sets will be arrays.
|
||||||
|
|
||||||
|
Can be used to decode certificates etc
|
||||||
|
======================================
|
||||||
|
|
||||||
|
$ fq -d raw 'frompem | asn1_ber | d' cert.pem
|
||||||
|
|
||||||
|
Can decode nested values
|
||||||
|
========================
|
||||||
|
|
||||||
|
$ fq -d asn1_ber '.constructed[1].value | asn1_ber' file.ber
|
||||||
|
|
||||||
|
Manual schema
|
||||||
|
=============
|
||||||
|
|
||||||
|
$ fq -d asn1_ber 'torepr as $r | ["version", "modulus", "private_exponent", "private_exponen", "prime1", "prime2", "exponent1", "exponent2", "coefficient"] | with_entries({key: .value, value: $r[.key]})' pkcs1.der
|
||||||
|
|
||||||
|
References
|
||||||
|
==========
|
||||||
|
- https://www.itu.int/ITU-T/studygroups/com10/languages/X.690_1297.pdf
|
||||||
|
- https://en.wikipedia.org/wiki/X.690
|
||||||
|
- https://letsencrypt.org/docs/a-warm-welcome-to-asn1-and-der/
|
||||||
|
- https://lapo.it/asn1js/
|
||||||
|
|
@ -9,3 +9,8 @@ Limitations:
|
|||||||
|
|
||||||
### References
|
### References
|
||||||
- https://avro.apache.org/docs/current/spec.html#Object+Container+Files
|
- https://avro.apache.org/docs/current/spec.html#Object+Container+Files
|
||||||
|
|
||||||
|
### Authors
|
||||||
|
- Xentripetal
|
||||||
|
xentripetal@fastmail.com
|
||||||
|
[@xentripetal](https://github.com/xentripetal)
|
||||||
|
28
format/avro/testdata/help_avro_ocf.fqtest
vendored
Normal file
28
format/avro/testdata/help_avro_ocf.fqtest
vendored
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
$ fq -h avro_ocf
|
||||||
|
avro_ocf: Avro object container file decoder
|
||||||
|
|
||||||
|
Decode examples
|
||||||
|
===============
|
||||||
|
|
||||||
|
# Decode file as avro_ocf
|
||||||
|
$ fq -d avro_ocf . file
|
||||||
|
# Decode value as avro_ocf
|
||||||
|
... | avro_ocf
|
||||||
|
|
||||||
|
Supports reading Avro Object Container Format (OCF) files based on the 1.11.0 specification.
|
||||||
|
|
||||||
|
Capable of handling null, deflate, and snappy codecs for data compression.
|
||||||
|
|
||||||
|
Limitations:
|
||||||
|
|
||||||
|
- Schema does not support self-referential types, only built-in types.
|
||||||
|
- Decimal logical types are not supported for decoding, will just be treated as their primitive type
|
||||||
|
|
||||||
|
References
|
||||||
|
==========
|
||||||
|
- https://avro.apache.org/docs/current/spec.html#Object+Container+Files
|
||||||
|
|
||||||
|
Authors
|
||||||
|
=======
|
||||||
|
- Xentripetal xentripetal@fastmail.com @xentripetal (https://github.com/xentripetal)
|
||||||
|
|
20
format/bencode/testdata/help_bencode.fqtest
vendored
Normal file
20
format/bencode/testdata/help_bencode.fqtest
vendored
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
$ fq -h bencode
|
||||||
|
bencode: BitTorrent bencoding decoder
|
||||||
|
|
||||||
|
Decode examples
|
||||||
|
===============
|
||||||
|
|
||||||
|
# Decode file as bencode
|
||||||
|
$ fq -d bencode . file
|
||||||
|
# Decode value as bencode
|
||||||
|
... | bencode
|
||||||
|
|
||||||
|
Convert represented value to JSON
|
||||||
|
=================================
|
||||||
|
|
||||||
|
$ fq -d bencode torepr file.torrent
|
||||||
|
|
||||||
|
References
|
||||||
|
==========
|
||||||
|
- https://wiki.theory.org/BitTorrentSpecification#Bencoding
|
||||||
|
|
20
format/bitcoin/testdata/help_bitcoin_block.fqtest
vendored
Normal file
20
format/bitcoin/testdata/help_bitcoin_block.fqtest
vendored
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
$ fq -h bitcoin_block
|
||||||
|
bitcoin_block: Bitcoin block decoder
|
||||||
|
|
||||||
|
Options
|
||||||
|
=======
|
||||||
|
|
||||||
|
has_header=false Has blkdat header
|
||||||
|
|
||||||
|
Decode examples
|
||||||
|
===============
|
||||||
|
|
||||||
|
# Decode file as bitcoin_block
|
||||||
|
$ fq -d bitcoin_block . file
|
||||||
|
# Decode value as bitcoin_block
|
||||||
|
... | bitcoin_block
|
||||||
|
# Decode file using bitcoin_block options
|
||||||
|
$ fq -d bitcoin_block -o has_header=false . file
|
||||||
|
# Decode value as bitcoin_block
|
||||||
|
... | bitcoin_block({has_header:false})
|
||||||
|
|
25
format/bson/testdata/help_bson.fqtest
vendored
Normal file
25
format/bson/testdata/help_bson.fqtest
vendored
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
$ fq -h bson
|
||||||
|
bson: Binary JSON decoder
|
||||||
|
|
||||||
|
Decode examples
|
||||||
|
===============
|
||||||
|
|
||||||
|
# Decode file as bson
|
||||||
|
$ fq -d bson . file
|
||||||
|
# Decode value as bson
|
||||||
|
... | bson
|
||||||
|
|
||||||
|
Convert represented value to JSON
|
||||||
|
=================================
|
||||||
|
|
||||||
|
$ fq -d bson torepr file.bson
|
||||||
|
|
||||||
|
Filter represented value
|
||||||
|
========================
|
||||||
|
|
||||||
|
$ fq -d bson 'torepr | select(.name=="bob")' file.bson
|
||||||
|
|
||||||
|
References
|
||||||
|
==========
|
||||||
|
- https://bsonspec.org/spec.html
|
||||||
|
|
21
format/cbor/testdata/help_cbor.fqtest
vendored
Normal file
21
format/cbor/testdata/help_cbor.fqtest
vendored
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
$ fq -h cbor
|
||||||
|
cbor: Concise Binary Object Representation decoder
|
||||||
|
|
||||||
|
Decode examples
|
||||||
|
===============
|
||||||
|
|
||||||
|
# Decode file as cbor
|
||||||
|
$ fq -d cbor . file
|
||||||
|
# Decode value as cbor
|
||||||
|
... | cbor
|
||||||
|
|
||||||
|
Convert represented value to JSON
|
||||||
|
=================================
|
||||||
|
|
||||||
|
$ fq -d cbor torepr file.cbor
|
||||||
|
|
||||||
|
References
|
||||||
|
==========
|
||||||
|
- https://en.wikipedia.org/wiki/CBOR
|
||||||
|
- https://www.rfc-editor.org/rfc/rfc8949.html
|
||||||
|
|
31
format/csv/testdata/help_csv.fqtest
vendored
Normal file
31
format/csv/testdata/help_csv.fqtest
vendored
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
$ fq -h csv
|
||||||
|
csv: Comma separated values decoder
|
||||||
|
|
||||||
|
Options
|
||||||
|
=======
|
||||||
|
|
||||||
|
comma=, Separator character
|
||||||
|
comment=# Comment line character
|
||||||
|
|
||||||
|
Decode examples
|
||||||
|
===============
|
||||||
|
|
||||||
|
# Decode file as csv
|
||||||
|
$ fq -d csv . file
|
||||||
|
# Decode value as csv
|
||||||
|
... | csv
|
||||||
|
# Decode file using csv options
|
||||||
|
$ fq -d csv -o comma="," -o comment="#" . file
|
||||||
|
# Decode value as csv
|
||||||
|
... | csv({comma:",",comment:"#"})
|
||||||
|
|
||||||
|
TSV to CSV
|
||||||
|
==========
|
||||||
|
|
||||||
|
$ fq -d csv -o comma="\t" tocsv file.tsv
|
||||||
|
|
||||||
|
Convert rows to objects based on header row
|
||||||
|
===========================================
|
||||||
|
|
||||||
|
$ fq -d csv '.[0] as $t | .[1:] | map(with_entries(.key = $t[.key]))' file.csv
|
||||||
|
|
20
format/flac/testdata/help_flac_frame.fqtest
vendored
Normal file
20
format/flac/testdata/help_flac_frame.fqtest
vendored
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
$ fq -h flac_frame
|
||||||
|
flac_frame: FLAC frame decoder
|
||||||
|
|
||||||
|
Options
|
||||||
|
=======
|
||||||
|
|
||||||
|
bits_per_sample=16 Bits per sample
|
||||||
|
|
||||||
|
Decode examples
|
||||||
|
===============
|
||||||
|
|
||||||
|
# Decode file as flac_frame
|
||||||
|
$ fq -d flac_frame . file
|
||||||
|
# Decode value as flac_frame
|
||||||
|
... | flac_frame
|
||||||
|
# Decode file using flac_frame options
|
||||||
|
$ fq -d flac_frame -o bits_per_sample=16 . file
|
||||||
|
# Decode value as flac_frame
|
||||||
|
... | flac_frame({bits_per_sample:16})
|
||||||
|
|
@ -8,3 +8,8 @@ $ fq '.load_commands[] | select(.cmd=="segment_64")' file
|
|||||||
|
|
||||||
### References
|
### References
|
||||||
- https://github.com/aidansteele/osx-abi-macho-file-format-reference
|
- https://github.com/aidansteele/osx-abi-macho-file-format-reference
|
||||||
|
|
||||||
|
### Authors
|
||||||
|
- Sıddık AÇIL
|
||||||
|
acils@itu.edu.tr
|
||||||
|
[@Akaame](https://github.com/Akaame)
|
||||||
|
26
format/macho/testdata/help_macho.fqtest
vendored
Normal file
26
format/macho/testdata/help_macho.fqtest
vendored
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
$ fq -h macho
|
||||||
|
macho: Mach-O macOS executable decoder
|
||||||
|
|
||||||
|
Decode examples
|
||||||
|
===============
|
||||||
|
|
||||||
|
# Decode file as macho
|
||||||
|
$ fq -d macho . file
|
||||||
|
# Decode value as macho
|
||||||
|
... | macho
|
||||||
|
|
||||||
|
Supports decoding vanilla and FAT Mach-O binaries.
|
||||||
|
|
||||||
|
Select 64bit load segments
|
||||||
|
==========================
|
||||||
|
|
||||||
|
$ fq '.load_commands[] | select(.cmd=="segment_64")' file
|
||||||
|
|
||||||
|
References
|
||||||
|
==========
|
||||||
|
- https://github.com/aidansteele/osx-abi-macho-file-format-reference
|
||||||
|
|
||||||
|
Authors
|
||||||
|
=======
|
||||||
|
- Sıddık AÇIL acils@itu.edu.tr @Akaame (https://github.com/Akaame)
|
||||||
|
|
@ -21,7 +21,13 @@ def _markdown_to_text($width; $header_depth):
|
|||||||
def _f($pln):
|
def _f($pln):
|
||||||
if type == "string" then gsub("\n"; " ")
|
if type == "string" then gsub("\n"; " ")
|
||||||
elif .type == "document" then .children[] | _f("\n\n")
|
elif .type == "document" then .children[] | _f("\n\n")
|
||||||
elif .type == "heading" then "#" * (.level+$header_depth), " ", (.children[] | _f("\n\n")), "\n"
|
elif .type == "heading" then
|
||||||
|
( (.children[] | _f("\n\n")) as $title
|
||||||
|
| $title
|
||||||
|
, "\n"
|
||||||
|
, ("=" * ($title | length))
|
||||||
|
, "\n"
|
||||||
|
)
|
||||||
elif .type == "paragraph" then
|
elif .type == "paragraph" then
|
||||||
( ( [.children[] | _f("\n\n")]
|
( ( [.children[] | _f("\n\n")]
|
||||||
| join("")
|
| join("")
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
### Lookup element path using `matroska_path`
|
### Lookup element using path
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
$ fq 'matroska_path(".Segment.Tracks[0)")' file.mkv
|
$ fq 'matroska_path(".Segment.Tracks[0)")' file.mkv
|
||||||
```
|
```
|
||||||
|
|
||||||
### Get element path using `matroska_path`
|
### Get path to element
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
$ fq 'grep_by(.id == "Tracks") | matroska_path' file.mkv
|
$ fq 'grep_by(.id == "Tracks") | matroska_path' file.mkv
|
||||||
|
29
format/matroska/testdata/help_matroska.fqtest
vendored
Normal file
29
format/matroska/testdata/help_matroska.fqtest
vendored
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
$ fq -h matroska
|
||||||
|
matroska: Matroska file decoder
|
||||||
|
|
||||||
|
Decode examples
|
||||||
|
===============
|
||||||
|
|
||||||
|
# Decode file as matroska
|
||||||
|
$ fq -d matroska . file
|
||||||
|
# Decode value as matroska
|
||||||
|
... | matroska
|
||||||
|
|
||||||
|
Lookup element using path
|
||||||
|
=========================
|
||||||
|
|
||||||
|
$ fq 'matroska_path(".Segment.Tracks[0)")' file.mkv
|
||||||
|
|
||||||
|
Get path to element
|
||||||
|
===================
|
||||||
|
|
||||||
|
$ fq 'grep_by(.id == "Tracks") | matroska_path' file.mkv
|
||||||
|
|
||||||
|
References
|
||||||
|
==========
|
||||||
|
- https://tools.ietf.org/html/draft-ietf-cellar-ebml-00
|
||||||
|
- https://matroska.org/technical/specs/index.html
|
||||||
|
- https://www.matroska.org/technical/basics.html
|
||||||
|
- https://www.matroska.org/technical/codec_specs.html
|
||||||
|
- https://wiki.xiph.org/MatroskaOpus
|
||||||
|
|
21
format/mp3/testdata/help_mp3.fqtest
vendored
Normal file
21
format/mp3/testdata/help_mp3.fqtest
vendored
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
$ fq -h mp3
|
||||||
|
mp3: MP3 file decoder
|
||||||
|
|
||||||
|
Options
|
||||||
|
=======
|
||||||
|
|
||||||
|
max_sync_seek=32768 Max byte distance to next sync
|
||||||
|
max_unique_header_configs=5 Max number of unique frame header configs allowed
|
||||||
|
|
||||||
|
Decode examples
|
||||||
|
===============
|
||||||
|
|
||||||
|
# Decode file as mp3
|
||||||
|
$ fq -d mp3 . file
|
||||||
|
# Decode value as mp3
|
||||||
|
... | mp3
|
||||||
|
# Decode file using mp3 options
|
||||||
|
$ fq -d mp3 -o max_sync_seek=32768 -o max_unique_header_configs=5 . file
|
||||||
|
# Decode value as mp3
|
||||||
|
... | mp3({max_sync_seek:32768,max_unique_header_configs:5})
|
||||||
|
|
@ -1,11 +1,11 @@
|
|||||||
### `mp4_path($path)` - Lookup mp4 box using a mp4 box path.
|
### Lookup mp4 box using a mp4 box path.
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
# <decode value box> | mp4_path($path) -> <decode value box>
|
# <decode value box> | mp4_path($path) -> <decode value box>
|
||||||
$ fq 'mp4_path(".moov.trak[1]")' file.mp4
|
$ fq 'mp4_path(".moov.trak[1]")' file.mp4
|
||||||
```
|
```
|
||||||
|
|
||||||
### `mp4_path` - Return mp4 box path for a decode value box.
|
### Get mp4 box path for a decode value box.
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
# <decode value box> | mp4_path -> string
|
# <decode value box> | mp4_path -> string
|
||||||
@ -18,9 +18,10 @@ $ fq 'grep_by(.type == "trak") | mp4_path' file.mp4
|
|||||||
$ fq -n '"AAAAHGVsc3QAAAAAAAAAAQAAADIAAAQAAAEAAA==" | frombase64 | mp4({force:true}) | d'
|
$ fq -n '"AAAAHGVsc3QAAAAAAAAAAQAAADIAAAQAAAEAAA==" | frombase64 | mp4({force:true}) | d'
|
||||||
```
|
```
|
||||||
|
|
||||||
### Don't decode samples and manually decode first sample for first track as a `aac_frame`
|
### Speed up decoding by not decoding samples
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
|
# manually decode first sample as a aac_frame
|
||||||
$ fq -o decode_samples=false '.tracks[0].samples[0] | aac_frame | d' file.mp4
|
$ fq -o decode_samples=false '.tracks[0].samples[0] | aac_frame | d' file.mp4
|
||||||
```
|
```
|
||||||
|
|
||||||
|
54
format/mp4/testdata/help_mp4.fqtest
vendored
Normal file
54
format/mp4/testdata/help_mp4.fqtest
vendored
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
$ fq -h mp4
|
||||||
|
mp4: ISOBMFF, QuickTime and similar decoder
|
||||||
|
|
||||||
|
Options
|
||||||
|
=======
|
||||||
|
|
||||||
|
allow_truncated=false Allow box to be truncated
|
||||||
|
decode_samples=true Decode supported media samples
|
||||||
|
|
||||||
|
Decode examples
|
||||||
|
===============
|
||||||
|
|
||||||
|
# Decode file as mp4
|
||||||
|
$ fq -d mp4 . file
|
||||||
|
# Decode value as mp4
|
||||||
|
... | mp4
|
||||||
|
# Decode file using mp4 options
|
||||||
|
$ fq -d mp4 -o allow_truncated=false -o decode_samples=true . file
|
||||||
|
# Decode value as mp4
|
||||||
|
... | mp4({allow_truncated:false,decode_samples:true})
|
||||||
|
|
||||||
|
Lookup mp4 box using a mp4 box path.
|
||||||
|
====================================
|
||||||
|
|
||||||
|
# <decode value box> | mp4_path($path) -> <decode value box>
|
||||||
|
$ fq 'mp4_path(".moov.trak[1]")' file.mp4
|
||||||
|
|
||||||
|
Get mp4 box path for a decode value box.
|
||||||
|
========================================
|
||||||
|
|
||||||
|
# <decode value box> | mp4_path -> string
|
||||||
|
$ fq 'grep_by(.type == "trak") | mp4_path' file.mp4
|
||||||
|
|
||||||
|
Force decode a single box
|
||||||
|
=========================
|
||||||
|
|
||||||
|
$ fq -n '"AAAAHGVsc3QAAAAAAAAAAQAAADIAAAQAAAEAAA==" | frombase64 | mp4({force:true}) | d'
|
||||||
|
|
||||||
|
Speed up decoding by not decoding samples
|
||||||
|
=========================================
|
||||||
|
|
||||||
|
# manually decode first sample as a aac_frame
|
||||||
|
$ fq -o decode_samples=false '.tracks[0].samples[0] | aac_frame | d' file.mp4
|
||||||
|
|
||||||
|
Entries for first edit list as values
|
||||||
|
=====================================
|
||||||
|
|
||||||
|
$ fq 'first(grep_by(.type=="elst").entries) | tovalue' file.mp4
|
||||||
|
|
||||||
|
References
|
||||||
|
==========
|
||||||
|
- ISO/IEC base media file format (MPEG-4 Part 12) (https://en.wikipedia.org/wiki/ISO/IEC_base_media_file_format)
|
||||||
|
- Quicktime file format (https://developer.apple.com/standards/qtff-2001.pdf)
|
||||||
|
|
20
format/mpeg/testdata/help_aac_frame.fqtest
vendored
Normal file
20
format/mpeg/testdata/help_aac_frame.fqtest
vendored
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
$ fq -h aac_frame
|
||||||
|
aac_frame: Advanced Audio Coding frame decoder
|
||||||
|
|
||||||
|
Options
|
||||||
|
=======
|
||||||
|
|
||||||
|
object_type=1 Audio object type
|
||||||
|
|
||||||
|
Decode examples
|
||||||
|
===============
|
||||||
|
|
||||||
|
# Decode file as aac_frame
|
||||||
|
$ fq -d aac_frame . file
|
||||||
|
# Decode value as aac_frame
|
||||||
|
... | aac_frame
|
||||||
|
# Decode file using aac_frame options
|
||||||
|
$ fq -d aac_frame -o object_type=1 . file
|
||||||
|
# Decode value as aac_frame
|
||||||
|
... | aac_frame({object_type:1})
|
||||||
|
|
20
format/mpeg/testdata/help_avc_au.fqtest
vendored
Normal file
20
format/mpeg/testdata/help_avc_au.fqtest
vendored
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
$ fq -h avc_au
|
||||||
|
avc_au: H.264/AVC Access Unit decoder
|
||||||
|
|
||||||
|
Options
|
||||||
|
=======
|
||||||
|
|
||||||
|
length_size=4 Length value size
|
||||||
|
|
||||||
|
Decode examples
|
||||||
|
===============
|
||||||
|
|
||||||
|
# Decode file as avc_au
|
||||||
|
$ fq -d avc_au . file
|
||||||
|
# Decode value as avc_au
|
||||||
|
... | avc_au
|
||||||
|
# Decode file using avc_au options
|
||||||
|
$ fq -d avc_au -o length_size=4 . file
|
||||||
|
# Decode value as avc_au
|
||||||
|
... | avc_au({length_size:4})
|
||||||
|
|
20
format/mpeg/testdata/help_hevc_au.fqtest
vendored
Normal file
20
format/mpeg/testdata/help_hevc_au.fqtest
vendored
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
$ fq -h hevc_au
|
||||||
|
hevc_au: H.265/HEVC Access Unit decoder
|
||||||
|
|
||||||
|
Options
|
||||||
|
=======
|
||||||
|
|
||||||
|
length_size=4 Length value size
|
||||||
|
|
||||||
|
Decode examples
|
||||||
|
===============
|
||||||
|
|
||||||
|
# Decode file as hevc_au
|
||||||
|
$ fq -d hevc_au . file
|
||||||
|
# Decode value as hevc_au
|
||||||
|
... | hevc_au
|
||||||
|
# Decode file using hevc_au options
|
||||||
|
$ fq -d hevc_au -o length_size=4 . file
|
||||||
|
# Decode value as hevc_au
|
||||||
|
... | hevc_au({length_size:4})
|
||||||
|
|
20
format/msgpack/testdata/help_msgpack.fqtest
vendored
Normal file
20
format/msgpack/testdata/help_msgpack.fqtest
vendored
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
$ fq -h msgpack
|
||||||
|
msgpack: MessagePack decoder
|
||||||
|
|
||||||
|
Decode examples
|
||||||
|
===============
|
||||||
|
|
||||||
|
# Decode file as msgpack
|
||||||
|
$ fq -d msgpack . file
|
||||||
|
# Decode value as msgpack
|
||||||
|
... | msgpack
|
||||||
|
|
||||||
|
Convert represented value to JSON
|
||||||
|
=================================
|
||||||
|
|
||||||
|
$ fq -d msgpack torepr file.msgpack
|
||||||
|
|
||||||
|
References
|
||||||
|
==========
|
||||||
|
- https://github.com/msgpack/msgpack/blob/master/spec.md
|
||||||
|
|
20
format/protobuf/testdata/help_protobuf.fqtest
vendored
Normal file
20
format/protobuf/testdata/help_protobuf.fqtest
vendored
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
$ fq -h protobuf
|
||||||
|
protobuf: Protobuf decoder
|
||||||
|
|
||||||
|
Decode examples
|
||||||
|
===============
|
||||||
|
|
||||||
|
# Decode file as protobuf
|
||||||
|
$ fq -d protobuf . file
|
||||||
|
# Decode value as protobuf
|
||||||
|
... | protobuf
|
||||||
|
|
||||||
|
Can decode sub messages
|
||||||
|
=======================
|
||||||
|
|
||||||
|
$ fq -d protobuf '.fields[6].wire_value | protobuf | d' file
|
||||||
|
|
||||||
|
References
|
||||||
|
==========
|
||||||
|
- https://developers.google.com/protocol-buffers/docs/encoding
|
||||||
|
|
18
format/rtmp/testdata/help_rtmp.fqtest
vendored
Normal file
18
format/rtmp/testdata/help_rtmp.fqtest
vendored
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
$ fq -h rtmp
|
||||||
|
rtmp: Real-Time Messaging Protocol decoder
|
||||||
|
|
||||||
|
Decode examples
|
||||||
|
===============
|
||||||
|
|
||||||
|
# Decode file as rtmp
|
||||||
|
$ fq -d rtmp . file
|
||||||
|
# Decode value as rtmp
|
||||||
|
... | rtmp
|
||||||
|
|
||||||
|
Current only supports plain RTMP (not RTMPT or encrypted variants etc) with AMF0 (not AMF3).
|
||||||
|
|
||||||
|
References
|
||||||
|
==========
|
||||||
|
- https://rtmp.veriskope.com/docs/spec/
|
||||||
|
- https://rtmp.veriskope.com/pdf/video_file_format_spec_v10.pdf
|
||||||
|
|
29
format/wasm/testdata/help_wasm.fqtest
vendored
Normal file
29
format/wasm/testdata/help_wasm.fqtest
vendored
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
$ fq -h wasm
|
||||||
|
wasm: WebAssembly Binary Format decoder
|
||||||
|
|
||||||
|
Decode examples
|
||||||
|
===============
|
||||||
|
|
||||||
|
# Decode file as wasm
|
||||||
|
$ fq -d wasm . file
|
||||||
|
# Decode value as wasm
|
||||||
|
... | wasm
|
||||||
|
|
||||||
|
Count opcode usage
|
||||||
|
==================
|
||||||
|
|
||||||
|
$ fq '.sections[] | select(.id == "code_section") | [.. | .opcode? // empty] | count | map({key: .[0], value: .[1]}) | from_entries' file.wasm
|
||||||
|
|
||||||
|
List exports and imports
|
||||||
|
========================
|
||||||
|
|
||||||
|
$ fq '.sections | {import: map(select(.id == "import_section").content.im.x[].nm.b), export: map(select(.id == "export_section").content.ex.x[].nm.b)}' file.wasm
|
||||||
|
|
||||||
|
Authors
|
||||||
|
=======
|
||||||
|
- Takashi Oguma @bitbears-dev (https://github.com/bitbears-dev) @0xb17bea125 (https://twitter.com/0xb17bea125)
|
||||||
|
|
||||||
|
References
|
||||||
|
==========
|
||||||
|
- https://webassembly.github.io/spec/core/
|
||||||
|
|
@ -51,14 +51,10 @@ $ '<a href="url">text</a>' | fq -d html -o array=true
|
|||||||
]
|
]
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
```
|
|
||||||
|
|
||||||
```sh
|
# decode html files to a {file: "title", ...} object
|
||||||
# Decode html files to a {file: "title", ...} object
|
|
||||||
$ fq -n -d html '[inputs | {key: input_filename, value: .html.head.title?}] | from_entries' *.html
|
$ fq -n -d html '[inputs | {key: input_filename, value: .html.head.title?}] | from_entries' *.html
|
||||||
```
|
|
||||||
|
|
||||||
```sh
|
|
||||||
# <a> href:s in file
|
# <a> href:s in file
|
||||||
$ fq -r -o array=true -d html '.. | select(.[0] == "a" and .[1].href)?.[1].href' file.html
|
$ fq -r -o array=true -d html '.. | select(.[0] == "a" and .[1].href)?.[1].href' file.html
|
||||||
```
|
```
|
||||||
|
81
format/xml/testdata/help_html.fqtest
vendored
Normal file
81
format/xml/testdata/help_html.fqtest
vendored
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
$ fq -h html
|
||||||
|
html: HyperText Markup Language decoder
|
||||||
|
|
||||||
|
Options
|
||||||
|
=======
|
||||||
|
|
||||||
|
array=false Decode as nested arrays
|
||||||
|
attribute_prefix=@ Prefix for attribute keys
|
||||||
|
seq=false Use seq attribute to preserve element order
|
||||||
|
|
||||||
|
Decode examples
|
||||||
|
===============
|
||||||
|
|
||||||
|
# Decode file as html
|
||||||
|
$ fq -d html . file
|
||||||
|
# Decode value as html
|
||||||
|
... | html
|
||||||
|
# Decode file using html options
|
||||||
|
$ fq -d html -o array=false -o attribute_prefix="@" -o seq=false . file
|
||||||
|
# Decode value as html
|
||||||
|
... | html({array:false,attribute_prefix:"@",seq:false})
|
||||||
|
|
||||||
|
HTML is decoded in HTML5 mode and will always include <html>, <body> and <head> element.
|
||||||
|
|
||||||
|
See xml format for more examples and how to preserve element order and how to encode to xml.
|
||||||
|
|
||||||
|
There is no tohtml function, see toxml instead.
|
||||||
|
|
||||||
|
Element as object
|
||||||
|
=================
|
||||||
|
|
||||||
|
# decode as object is the default
|
||||||
|
$ echo '<a href="url">text</a>' | fq -d html
|
||||||
|
{
|
||||||
|
"html": {
|
||||||
|
"body": {
|
||||||
|
"a": {
|
||||||
|
"#text": "text",
|
||||||
|
"@href": "url"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"head": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Element as array
|
||||||
|
================
|
||||||
|
|
||||||
|
$ '<a href="url">text</a>' | fq -d html -o array=true
|
||||||
|
[
|
||||||
|
"html",
|
||||||
|
null,
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"head",
|
||||||
|
null,
|
||||||
|
[]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"body",
|
||||||
|
null,
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"a",
|
||||||
|
{
|
||||||
|
"#text": "text",
|
||||||
|
"href": "url"
|
||||||
|
},
|
||||||
|
[]
|
||||||
|
]
|
||||||
|
]
|
||||||
|
]
|
||||||
|
]
|
||||||
|
]
|
||||||
|
|
||||||
|
# decode html files to a {file: "title", ...} object
|
||||||
|
$ fq -n -d html '[inputs | {key: input_filename, value: .html.head.title?}] | from_entries' *.html
|
||||||
|
|
||||||
|
# <a> href:s in file
|
||||||
|
$ fq -r -o array=true -d html '.. | select(.[0] == "a" and .[1].href)?.[1].href' file.html
|
||||||
|
|
124
format/xml/testdata/help_xml.fqtest
vendored
Normal file
124
format/xml/testdata/help_xml.fqtest
vendored
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
$ fq -h xml
|
||||||
|
xml: Extensible Markup Language decoder
|
||||||
|
|
||||||
|
Options
|
||||||
|
=======
|
||||||
|
|
||||||
|
array=false Decode as nested arrays
|
||||||
|
attribute_prefix=@ Prefix for attribute keys
|
||||||
|
seq=false Use seq attribute to preserve element order
|
||||||
|
|
||||||
|
Decode examples
|
||||||
|
===============
|
||||||
|
|
||||||
|
# Decode file as xml
|
||||||
|
$ fq -d xml . file
|
||||||
|
# Decode value as xml
|
||||||
|
... | xml
|
||||||
|
# Decode file using xml options
|
||||||
|
$ fq -d xml -o array=false -o attribute_prefix="@" -o seq=false . file
|
||||||
|
# Decode value as xml
|
||||||
|
... | xml({array:false,attribute_prefix:"@",seq:false})
|
||||||
|
|
||||||
|
XML can be decoded and encoded into jq values in two ways, elements as object or array. Which variant to use depends a bit what you want to do. The object variant
|
||||||
|
might be easier to query for a specific value but array might be easier to use to generate xml or to query after all elements of some kind etc.
|
||||||
|
|
||||||
|
Encoding is done using the toxml function and it will figure what variant that is used based on the input value. Is has two optional options indent and
|
||||||
|
attribute_prefix.
|
||||||
|
|
||||||
|
Elements as object
|
||||||
|
==================
|
||||||
|
Element can have different shapes depending on body text, attributes and children:
|
||||||
|
|
||||||
|
- <a key="value">text</a> is {"a":{"#text":"text","@key":"value"}}, has text (#text) and attributes (@key)
|
||||||
|
- <a>text</a> is {"a":"text"}
|
||||||
|
- <a><b>text</b></a> is {"a":{"b":"text"}} one child with only text and no attributes
|
||||||
|
- <a><b/><b>text</b></a> is {"a":{"b":["","text"]}} two children with same name end up in an array
|
||||||
|
- <a><b/><b key="value">text</b></a> is {"a":{"b":["",{"#text":"text","@key":"value"}]}}
|
||||||
|
|
||||||
|
If there is #seq attribute it encodes the child element order. Use -o seq=true to include sequence number when decoding, otherwise order might be lost.
|
||||||
|
|
||||||
|
|
||||||
|
# decode as object is the default
|
||||||
|
$ echo '<a><b/><b>bbb</b><c attr="value">ccc</c></a>' | fq -d xml -o seq=true
|
||||||
|
{
|
||||||
|
"a": {
|
||||||
|
"b": [
|
||||||
|
{
|
||||||
|
"#seq": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"#seq": 1,
|
||||||
|
"#text": "bbb"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"c": {
|
||||||
|
"#seq": 2,
|
||||||
|
"#text": "ccc",
|
||||||
|
"@attr": "value"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# access text of the <c> element
|
||||||
|
$ echo '<a><b/><b>bbb</b><c attr="value">ccc</c></a>' | fq '.a.c["#text"]'
|
||||||
|
"ccc"
|
||||||
|
|
||||||
|
# decode to object and encode to xml
|
||||||
|
$ echo '<a><b/><b>bbb</b><c attr="value">ccc</c></a>' | fq -r -d xml -o seq=true 'toxml({indent:2})'
|
||||||
|
<a>
|
||||||
|
<b></b>
|
||||||
|
<b>bbb</b>
|
||||||
|
<c attr="value">ccc</c>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
Elements as array
|
||||||
|
=================
|
||||||
|
Elements are arrays of the shape ["#text": "body text", "attr_name", {key: "attr value"}|null, [<child element>, ...]].
|
||||||
|
|
||||||
|
|
||||||
|
# decode as array
|
||||||
|
✗ echo '<a><b/><b>bbb</b><c attr="value">ccc</c></a>' | fq -d xml -o array=true
|
||||||
|
[
|
||||||
|
"a",
|
||||||
|
null,
|
||||||
|
[
|
||||||
|
[
|
||||||
|
"b",
|
||||||
|
null,
|
||||||
|
[]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"b",
|
||||||
|
{
|
||||||
|
"#text": "bbb"
|
||||||
|
},
|
||||||
|
[]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"c",
|
||||||
|
{
|
||||||
|
"#text": "ccc",
|
||||||
|
"attr": "value"
|
||||||
|
},
|
||||||
|
[]
|
||||||
|
]
|
||||||
|
]
|
||||||
|
]
|
||||||
|
|
||||||
|
# decode to array and encode to xml
|
||||||
|
$ echo '<a><b/><b>bbb</b><c attr="value">ccc</c></a>' | fq -r -d xml -o array=true -o seq=true 'toxml({indent:2})'
|
||||||
|
<a>
|
||||||
|
<b></b>
|
||||||
|
<b>bbb</b>
|
||||||
|
<c attr="value">ccc</c>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
# access text of the <c> element, the object variant above is probably easier to use
|
||||||
|
$ echo '<a><b/><b>bbb</b><c attr="value">ccc</c></a>' | fq -o array=true '.[2][2][1]["#text"]'
|
||||||
|
"ccc"
|
||||||
|
|
||||||
|
References
|
||||||
|
==========
|
||||||
|
- xml.com's Converting Between XML and JSON (https://www.xml.com/pub/a/2006/05/31/converting-between-xml-and-json.html)
|
||||||
|
|
@ -44,9 +44,7 @@ $ echo '<a><b/><b>bbb</b><c attr="value">ccc</c></a>' | fq -d xml -o seq=true
|
|||||||
# access text of the <c> element
|
# access text of the <c> element
|
||||||
$ echo '<a><b/><b>bbb</b><c attr="value">ccc</c></a>' | fq '.a.c["#text"]'
|
$ echo '<a><b/><b>bbb</b><c attr="value">ccc</c></a>' | fq '.a.c["#text"]'
|
||||||
"ccc"
|
"ccc"
|
||||||
```
|
|
||||||
|
|
||||||
```sh
|
|
||||||
# decode to object and encode to xml
|
# decode to object and encode to xml
|
||||||
$ echo '<a><b/><b>bbb</b><c attr="value">ccc</c></a>' | fq -r -d xml -o seq=true 'toxml({indent:2})'
|
$ echo '<a><b/><b>bbb</b><c attr="value">ccc</c></a>' | fq -r -d xml -o seq=true 'toxml({indent:2})'
|
||||||
<a>
|
<a>
|
||||||
@ -89,11 +87,9 @@ Elements are arrays of the shape `["#text": "body text", "attr_name", {key: "att
|
|||||||
]
|
]
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
```
|
|
||||||
|
|
||||||
```sh
|
|
||||||
# decode to array and encode to xml
|
# decode to array and encode to xml
|
||||||
✗ echo '<a><b/><b>bbb</b><c attr="value">ccc</c></a>' | fq -r -d xml -o array=true -o seq=true 'toxml({indent:2})'
|
$ echo '<a><b/><b>bbb</b><c attr="value">ccc</c></a>' | fq -r -d xml -o array=true -o seq=true 'toxml({indent:2})'
|
||||||
<a>
|
<a>
|
||||||
<b></b>
|
<b></b>
|
||||||
<b>bbb</b>
|
<b>bbb</b>
|
||||||
|
27
format/zip/testdata/help_zip.fqtest
vendored
Normal file
27
format/zip/testdata/help_zip.fqtest
vendored
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
$ fq -h zip
|
||||||
|
zip: ZIP archive decoder
|
||||||
|
|
||||||
|
Options
|
||||||
|
=======
|
||||||
|
|
||||||
|
uncompress=true Uncompress and probe files
|
||||||
|
|
||||||
|
Decode examples
|
||||||
|
===============
|
||||||
|
|
||||||
|
# Decode file as zip
|
||||||
|
$ fq -d zip . file
|
||||||
|
# Decode value as zip
|
||||||
|
... | zip
|
||||||
|
# Decode file using zip options
|
||||||
|
$ fq -d zip -o uncompress=true . file
|
||||||
|
# Decode value as zip
|
||||||
|
... | zip({uncompress:true})
|
||||||
|
|
||||||
|
Supports ZIP64.
|
||||||
|
|
||||||
|
References
|
||||||
|
==========
|
||||||
|
- https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT
|
||||||
|
- https://opensource.apple.com/source/zip/zip-6/unzip/unzip/proginfo/extra.fld
|
||||||
|
|
@ -140,11 +140,13 @@ def _help($arg0; $topic):
|
|||||||
| (_format_func($f.name; "_help")? // {} | _help_format_enrich($arg0; $f; true)) as $fhelp
|
| (_format_func($f.name; "_help")? // {} | _help_format_enrich($arg0; $f; true)) as $fhelp
|
||||||
| ((_registry.files[][] | select(.name=="\($topic).md").data) // false) as $doc
|
| ((_registry.files[][] | select(.name=="\($topic).md").data) // false) as $doc
|
||||||
| "\($f.name): \($f.description) decoder"
|
| "\($f.name): \($f.description) decoder"
|
||||||
|
, ""
|
||||||
, if $f.decode_in_arg then
|
, if $f.decode_in_arg then
|
||||||
( $f.decode_in_arg
|
( $f.decode_in_arg
|
||||||
| to_entries
|
| to_entries
|
||||||
| map([" \(.key)=\(.value) ", $f.decode_in_arg_doc[.key]])
|
| map([" \(.key)=\(.value) ", $f.decode_in_arg_doc[.key]])
|
||||||
| "# Options"
|
| "Options"
|
||||||
|
, "======="
|
||||||
, ""
|
, ""
|
||||||
, table(
|
, table(
|
||||||
.;
|
.;
|
||||||
@ -157,11 +159,12 @@ def _help($arg0; $topic):
|
|||||||
)
|
)
|
||||||
) | join("")
|
) | join("")
|
||||||
)
|
)
|
||||||
|
, ""
|
||||||
)
|
)
|
||||||
else empty
|
else empty
|
||||||
end
|
end
|
||||||
, ""
|
, "Decode examples"
|
||||||
, "# Decode examples"
|
, "==============="
|
||||||
, ""
|
, ""
|
||||||
, ( $fhelp.examples[]
|
, ( $fhelp.examples[]
|
||||||
| " # \(.comment)"
|
| " # \(.comment)"
|
||||||
|
108
pkg/interp/testdata/args.fqtest
vendored
108
pkg/interp/testdata/args.fqtest
vendored
@ -98,114 +98,6 @@ string_input false
|
|||||||
unicode false
|
unicode false
|
||||||
verbose false
|
verbose false
|
||||||
width 135
|
width 135
|
||||||
$ fq --help formats
|
|
||||||
aac_frame Advanced Audio Coding frame
|
|
||||||
adts Audio Data Transport Stream
|
|
||||||
adts_frame Audio Data Transport Stream frame
|
|
||||||
amf0 Action Message Format 0
|
|
||||||
apev2 APEv2 metadata tag
|
|
||||||
ar Unix archive
|
|
||||||
asn1_ber ASN1 BER (basic encoding rules, also CER and DER)
|
|
||||||
av1_ccr AV1 Codec Configuration Record
|
|
||||||
av1_frame AV1 frame
|
|
||||||
av1_obu AV1 Open Bitstream Unit
|
|
||||||
avc_annexb H.264/AVC Annex B
|
|
||||||
avc_au H.264/AVC Access Unit
|
|
||||||
avc_dcr H.264/AVC Decoder Configuration Record
|
|
||||||
avc_nalu H.264/AVC Network Access Layer Unit
|
|
||||||
avc_pps H.264/AVC Picture Parameter Set
|
|
||||||
avc_sei H.264/AVC Supplemental Enhancement Information
|
|
||||||
avc_sps H.264/AVC Sequence Parameter Set
|
|
||||||
avro_ocf Avro object container file
|
|
||||||
bencode BitTorrent bencoding
|
|
||||||
bitcoin_blkdat Bitcoin blk.dat
|
|
||||||
bitcoin_block Bitcoin block
|
|
||||||
bitcoin_script Bitcoin script
|
|
||||||
bitcoin_transaction Bitcoin transaction
|
|
||||||
bsd_loopback_frame BSD loopback frame
|
|
||||||
bson Binary JSON
|
|
||||||
bzip2 bzip2 compression
|
|
||||||
cbor Concise Binary Object Representation
|
|
||||||
csv Comma separated values
|
|
||||||
dns DNS packet
|
|
||||||
dns_tcp DNS packet (TCP)
|
|
||||||
elf Executable and Linkable Format
|
|
||||||
ether8023_frame Ethernet 802.3 frame
|
|
||||||
exif Exchangeable Image File Format
|
|
||||||
fairplay_spc FairPlay Server Playback Context
|
|
||||||
flac Free Lossless Audio Codec file
|
|
||||||
flac_frame FLAC frame
|
|
||||||
flac_metadatablock FLAC metadatablock
|
|
||||||
flac_metadatablocks FLAC metadatablocks
|
|
||||||
flac_picture FLAC metadatablock picture
|
|
||||||
flac_streaminfo FLAC streaminfo
|
|
||||||
gif Graphics Interchange Format
|
|
||||||
gzip gzip compression
|
|
||||||
hevc_annexb H.265/HEVC Annex B
|
|
||||||
hevc_au H.265/HEVC Access Unit
|
|
||||||
hevc_dcr H.265/HEVC Decoder Configuration Record
|
|
||||||
hevc_nalu H.265/HEVC Network Access Layer Unit
|
|
||||||
hevc_pps H.265/HEVC Picture Parameter Set
|
|
||||||
hevc_sps H.265/HEVC Sequence Parameter Set
|
|
||||||
hevc_vps H.265/HEVC Video Parameter Set
|
|
||||||
html HyperText Markup Language
|
|
||||||
icc_profile International Color Consortium profile
|
|
||||||
icmp Internet Control Message Protocol
|
|
||||||
icmpv6 Internet Control Message Protocol v6
|
|
||||||
id3v1 ID3v1 metadata
|
|
||||||
id3v11 ID3v1.1 metadata
|
|
||||||
id3v2 ID3v2 metadata
|
|
||||||
ipv4_packet Internet protocol v4 packet
|
|
||||||
ipv6_packet Internet protocol v6 packet
|
|
||||||
jpeg Joint Photographic Experts Group file
|
|
||||||
json JavaScript Object Notation
|
|
||||||
jsonl JavaScript Object Notation Lines
|
|
||||||
macho Mach-O macOS executable
|
|
||||||
macho_fat Fat Mach-O macOS executable (multi-architecture)
|
|
||||||
markdown Markdown
|
|
||||||
matroska Matroska file
|
|
||||||
mp3 MP3 file
|
|
||||||
mp3_frame MPEG audio layer 3 frame
|
|
||||||
mp4 ISOBMFF, QuickTime and similar
|
|
||||||
mpeg_asc MPEG-4 Audio Specific Config
|
|
||||||
mpeg_es MPEG Elementary Stream
|
|
||||||
mpeg_pes MPEG Packetized elementary stream
|
|
||||||
mpeg_pes_packet MPEG Packetized elementary stream packet
|
|
||||||
mpeg_spu Sub Picture Unit (DVD subtitle)
|
|
||||||
mpeg_ts MPEG Transport Stream
|
|
||||||
msgpack MessagePack
|
|
||||||
ogg OGG file
|
|
||||||
ogg_page OGG page
|
|
||||||
opus_packet Opus packet
|
|
||||||
pcap PCAP packet capture
|
|
||||||
pcapng PCAPNG packet capture
|
|
||||||
png Portable Network Graphics file
|
|
||||||
prores_frame Apple ProRes frame
|
|
||||||
protobuf Protobuf
|
|
||||||
protobuf_widevine Widevine protobuf
|
|
||||||
pssh_playready PlayReady PSSH
|
|
||||||
raw Raw bits
|
|
||||||
rtmp Real-Time Messaging Protocol
|
|
||||||
sll2_packet Linux cooked capture encapsulation v2
|
|
||||||
sll_packet Linux cooked capture encapsulation
|
|
||||||
tar Tar archive
|
|
||||||
tcp_segment Transmission control protocol segment
|
|
||||||
tiff Tag Image File Format
|
|
||||||
toml Tom's Obvious, Minimal Language
|
|
||||||
udp_datagram User datagram protocol
|
|
||||||
vorbis_comment Vorbis comment
|
|
||||||
vorbis_packet Vorbis packet
|
|
||||||
vp8_frame VP8 frame
|
|
||||||
vp9_cfm VP9 Codec Feature Metadata
|
|
||||||
vp9_frame VP9 frame
|
|
||||||
vpx_ccr VPX Codec Configuration Record
|
|
||||||
wasm WebAssembly Binary Format
|
|
||||||
wav WAV file
|
|
||||||
webp WebP image
|
|
||||||
xing Xing header
|
|
||||||
xml Extensible Markup Language
|
|
||||||
yaml YAML Ain't Markup Language
|
|
||||||
zip ZIP archive
|
|
||||||
$ fq -X
|
$ fq -X
|
||||||
exitcode: 2
|
exitcode: 2
|
||||||
stderr:
|
stderr:
|
||||||
|
Loading…
Reference in New Issue
Block a user