Latest release

This commit is contained in:
Mike Farah 2022-02-15 14:16:04 +11:00
parent 38f40fbcff
commit caf36e39b8
9 changed files with 350 additions and 19 deletions

View File

@ -22,6 +22,7 @@
* [Comment Operators](operators/comment-operators.md) * [Comment Operators](operators/comment-operators.md)
* [Contains](operators/contains.md) * [Contains](operators/contains.md)
* [Create, Collect into Object](operators/create-collect-into-object.md) * [Create, Collect into Object](operators/create-collect-into-object.md)
* [Date Time](operators/datetime.md)
* [Delete](operators/delete.md) * [Delete](operators/delete.md)
* [Document Index](operators/document-index.md) * [Document Index](operators/document-index.md)
* [Encode / Decode](operators/encode-decode.md) * [Encode / Decode](operators/encode-decode.md)

View File

@ -206,6 +206,38 @@ a: 4
b: 6 b: 6
``` ```
## Date addition
You can add durations to dates. Assumes RFC3339 date time format, see [date-time operators](https://mikefarah.gitbook.io/yq/operators/date-time-operators) for more information.
Given a sample.yml file of:
```yaml
a: 2021-01-01T00:00:00Z
```
then
```bash
yq '.a += "3h10m"' sample.yml
```
will output
```yaml
a: 2021-01-01T03:10:00Z
```
## Date addition - custom format
You can add durations to dates. See [date-time operators](https://mikefarah.gitbook.io/yq/operators/date-time-operators) for more information.
Given a sample.yml file of:
```yaml
a: Saturday, 15-Dec-01 at 2:59AM GMT
```
then
```bash
yq 'with_dtf("Monday, 02-Jan-06 at 3:04PM MST", .a += "3h1m")' sample.yml
```
will output
```yaml
a: Saturday, 15-Dec-01 at 6:00AM GMT
```
## Add to null ## Add to null
Adding to null simply returns the rhs Adding to null simply returns the rhs

View File

@ -23,7 +23,7 @@ a: cat
``` ```
then then
```bash ```bash
yq '.a lineComment="single"' sample.yml yq '.a line_comment="single"' sample.yml
``` ```
will output will output
```yaml ```yaml
@ -38,7 +38,7 @@ b: dog
``` ```
then then
```bash ```bash
yq '.. lineComment |= .' sample.yml yq '.. line_comment |= .' sample.yml
``` ```
will output will output
```yaml ```yaml
@ -53,7 +53,7 @@ a: cat
``` ```
then then
```bash ```bash
yq '. headComment="single"' sample.yml yq '. head_comment="single"' sample.yml
``` ```
will output will output
```yaml ```yaml
@ -69,7 +69,7 @@ a: cat
``` ```
then then
```bash ```bash
yq '. footComment=.a' sample.yml yq '. foot_comment=.a' sample.yml
``` ```
will output will output
```yaml ```yaml
@ -86,7 +86,7 @@ b: dog # leave this
``` ```
then then
```bash ```bash
yq '.a lineComment=""' sample.yml yq '.a line_comment=""' sample.yml
``` ```
will output will output
```yaml ```yaml
@ -120,7 +120,7 @@ a: cat # meow
``` ```
then then
```bash ```bash
yq '.a | lineComment' sample.yml yq '.a | line_comment' sample.yml
``` ```
will output will output
```yaml ```yaml
@ -138,7 +138,7 @@ a: cat # meow
``` ```
then then
```bash ```bash
yq '. | headComment' sample.yml yq '. | head_comment' sample.yml
``` ```
will output will output
```yaml ```yaml
@ -157,7 +157,7 @@ a: cat # meow
``` ```
then then
```bash ```bash
yq 'headComment' sample.yml yq 'head_comment' sample.yml
``` ```
will output will output
```yaml ```yaml
@ -177,7 +177,7 @@ a: cat # meow
``` ```
then then
```bash ```bash
yq '. | footComment' sample.yml yq '. | foot_comment' sample.yml
``` ```
will output will output
```yaml ```yaml

203
operators/datetime.md Normal file
View File

@ -0,0 +1,203 @@
# Date Time
Various operators for parsing and manipulating dates.
## Date time formattings
This uses the golangs built in time library for parsing and formatting date times.
When not specified, the RFC3339 standard is assumed `2006-01-02T15:04:05Z07:00` for parsing.
To specify a custom parsing format, use the `with_dtf` operator. The first parameter sets the datetime parsing format for the expression in the second parameter. The expression can be any valid `yq` expression tree.
```bash
yq 'with_dtf("myformat"; .a + "3h" | tz("Australia/Melbourne"))'
```
See https://pkg.go.dev/time#pkg-constants for examples of formatting options.
## Timezones
This uses golangs built in LoadLocation function to parse timezones strings. See https://pkg.go.dev/time#LoadLocation for more details.
## Durations
Durations are parsed using golangs built in [ParseDuration](https://pkg.go.dev/time#ParseDuration) function.
You can durations to time using the `+` operator.
{% hint style="warning" %}
Note that versions prior to 4.18 require the 'eval/e' command to be specified. 
`yq e <exp> <file>`
{% endhint %}
## Format: from standard RFC3339 format
Providing a single parameter assumes a standard RFC3339 datetime format. If the target format is not a valid yaml datetime format, the result will be a string tagged node.
Given a sample.yml file of:
```yaml
a: 2001-12-15T02:59:43.1Z
```
then
```bash
yq '.a |= format_datetime("Monday, 02-Jan-06 at 3:04PM")' sample.yml
```
will output
```yaml
a: Saturday, 15-Dec-01 at 2:59AM
```
## Format: from custom date time
Use with_dtf to set a custom datetime format for parsing.
Given a sample.yml file of:
```yaml
a: Saturday, 15-Dec-01 at 2:59AM
```
then
```bash
yq '.a |= with_dtf("Monday, 02-Jan-06 at 3:04PM"; format_datetime("2006-01-02"))' sample.yml
```
will output
```yaml
a: 2001-12-15
```
## Format: get the day of the week
Given a sample.yml file of:
```yaml
a: 2001-12-15T02:59:43.1Z
```
then
```bash
yq '.a | format_datetime("Monday")' sample.yml
```
will output
```yaml
Saturday
```
## Now
Given a sample.yml file of:
```yaml
a: cool
```
then
```bash
yq '.updated = now' sample.yml
```
will output
```yaml
a: cool
updated: 2021-05-19T01:02:03Z
```
## Timezone: from standard RFC3339 format
Returns a new datetime in the specified timezone. Specify standard IANA Time Zone format or 'utc', 'local'. When given a single parameter, this assumes the datetime is in RFC3339 format.
Given a sample.yml file of:
```yaml
a: cool
```
then
```bash
yq '.updated = (now | tz("Australia/Sydney"))' sample.yml
```
will output
```yaml
a: cool
updated: 2021-05-19T11:02:03+10:00
```
## Timezone: with custom format
Specify standard IANA Time Zone format or 'utc', 'local'
Given a sample.yml file of:
```yaml
a: Saturday, 15-Dec-01 at 2:59AM GMT
```
then
```bash
yq '.a |= with_dtf("Monday, 02-Jan-06 at 3:04PM MST"; tz("Australia/Sydney"))' sample.yml
```
will output
```yaml
a: Saturday, 15-Dec-01 at 1:59PM AEDT
```
## Add and tz custom format
Specify standard IANA Time Zone format or 'utc', 'local'
Given a sample.yml file of:
```yaml
a: Saturday, 15-Dec-01 at 2:59AM GMT
```
then
```bash
yq '.a |= with_dtf("Monday, 02-Jan-06 at 3:04PM MST"; tz("Australia/Sydney"))' sample.yml
```
will output
```yaml
a: Saturday, 15-Dec-01 at 1:59PM AEDT
```
## Date addition
Given a sample.yml file of:
```yaml
a: 2021-01-01T00:00:00Z
```
then
```bash
yq '.a += "3h10m"' sample.yml
```
will output
```yaml
a: 2021-01-01T03:10:00Z
```
## Date subtraction
You can subtract durations from dates. Assumes RFC3339 date time format, see [date-time operators](https://mikefarah.gitbook.io/yq/operators/date-time-operators) for more information.
Given a sample.yml file of:
```yaml
a: 2021-01-01T03:10:00Z
```
then
```bash
yq '.a -= "3h10m"' sample.yml
```
will output
```yaml
a: 2021-01-01T00:00:00Z
```
## Date addition - custom format
Given a sample.yml file of:
```yaml
a: Saturday, 15-Dec-01 at 2:59AM GMT
```
then
```bash
yq 'with_dtf("Monday, 02-Jan-06 at 3:04PM MST"; .a += "3h1m")' sample.yml
```
will output
```yaml
a: Saturday, 15-Dec-01 at 6:00AM GMT
```
## Date script with custom format
You can embed full expressions in with_dtf if needed.
Given a sample.yml file of:
```yaml
a: Saturday, 15-Dec-01 at 2:59AM GMT
```
then
```bash
yq 'with_dtf("Monday, 02-Jan-06 at 3:04PM MST"; .a = (.a + "3h1m" | tz("Australia/Perth")))' sample.yml
```
will output
```yaml
a: Saturday, 15-Dec-01 at 2:00PM AWST
```

View File

@ -17,7 +17,7 @@ a: frog
``` ```
then then
```bash ```bash
yq '.a | documentIndex' sample.yml yq '.a | document_index' sample.yml
``` ```
will output will output
```yaml ```yaml
@ -53,7 +53,7 @@ a: frog
``` ```
then then
```bash ```bash
yq 'select(documentIndex == 1)' sample.yml yq 'select(document_index == 1)' sample.yml
``` ```
will output will output
```yaml ```yaml
@ -85,7 +85,7 @@ a: frog
``` ```
then then
```bash ```bash
yq '.a | ({"match": ., "doc": documentIndex})' sample.yml yq '.a | ({"match": ., "doc": document_index})' sample.yml
``` ```
will output will output
```yaml ```yaml

View File

@ -37,7 +37,7 @@ a: cat
``` ```
then then
```bash ```bash
yq 'fileIndex' sample.yml yq 'file_index' sample.yml
``` ```
will output will output
```yaml ```yaml
@ -55,7 +55,7 @@ a: cat
``` ```
then then
```bash ```bash
yq eval-all 'fileIndex' sample.yml another.yml yq eval-all 'file_index' sample.yml another.yml
``` ```
will output will output
```yaml ```yaml

View File

@ -11,7 +11,7 @@ Note that versions prior to 4.18 require the 'eval/e' command to be specified.&#
## Split empty ## Split empty
Running Running
```bash ```bash
yq --null-input 'splitDoc' yq --null-input 'split_doc'
``` ```
will output will output
```yaml ```yaml
@ -26,7 +26,7 @@ Given a sample.yml file of:
``` ```
then then
```bash ```bash
yq '.[] | splitDoc' sample.yml yq '.[] | split_doc' sample.yml
``` ```
will output will output
```yaml ```yaml

View File

@ -117,6 +117,38 @@ a: 2
b: 4 b: 4
``` ```
## Date subtraction
You can subtract durations from dates. Assumes RFC3339 date time format, see [date-time operators](https://mikefarah.gitbook.io/yq/operators/date-time-operators) for more information.
Given a sample.yml file of:
```yaml
a: 2021-01-01T03:10:00Z
```
then
```bash
yq '.a -= "3h10m"' sample.yml
```
will output
```yaml
a: 2021-01-01T00:00:00Z
```
## Date subtraction - custom format
Use with_dtf to specify your datetime format. See [date-time operators](https://mikefarah.gitbook.io/yq/operators/date-time-operators) for more information.
Given a sample.yml file of:
```yaml
a: Saturday, 15-Dec-01 at 6:00AM GMT
```
then
```bash
yq 'with_dtf("Monday, 02-Jan-06 at 3:04PM MST", .a -= "3h1m")' sample.yml
```
will output
```yaml
a: Saturday, 15-Dec-01 at 2:59AM GMT
```
## Custom types: that are really numbers ## Custom types: that are really numbers
When custom tags are encountered, yq will try to decode the underlying type. When custom tags are encountered, yq will try to decode the underlying type.

View File

@ -27,7 +27,7 @@ emptyMap: []
``` ```
then then
```bash ```bash
yq -o=props -I=0 '.' sample.yml yq -o=props sample.yml
``` ```
will output will output
```properties ```properties
@ -54,7 +54,7 @@ emptyMap: []
``` ```
then then
```bash ```bash
yq -o=props -I=0 '... comments = ""' sample.yml yq -o=props '... comments = ""' sample.yml
``` ```
will output will output
```properties ```properties
@ -80,7 +80,7 @@ emptyMap: []
``` ```
then then
```bash ```bash
yq -o=props -I=0 '(.. | select( (tag == "!!map" or tag =="!!seq") and length == 0)) = ""' sample.yml yq -o=props '(.. | select( (tag == "!!map" or tag =="!!seq") and length == 0)) = ""' sample.yml
``` ```
will output will output
```properties ```properties
@ -94,3 +94,66 @@ emptyArray =
emptyMap = emptyMap =
``` ```
## Decode properties
Given a sample.properties file of:
```properties
# comments on values appear
person.name = Mike
# comments on array values appear
person.pets.0 = cat
person.food.0 = pizza
```
then
```bash
yq -p=props sample.properties
```
will output
```yaml
person:
name: Mike # comments on values appear
pets:
- cat # comments on array values appear
food:
- pizza
```
## Roundtrip
Given a sample.properties file of:
```properties
# comments on values appear
person.name = Mike
# comments on array values appear
person.pets.0 = cat
person.food.0 = pizza
```
then
```bash
yq -p=props -o=props '.person.pets.0 = "dog"' sample.properties
```
will output
```properties
# comments on values appear
person.name = Mike
# comments on array values appear
person.pets.0 = dog
person.food.0 = pizza
```
## Empty doc
Given a sample.properties file of:
```properties
```
then
```bash
yq -p=props sample.properties
```
will output
```yaml
```