mirror of
https://github.com/mikefarah/yq.git
synced 2024-12-19 20:19:04 +00:00
Added string trim operator
This commit is contained in:
parent
989dabac5a
commit
a696dceea4
@ -112,6 +112,26 @@ will output
|
|||||||
cat; meow; 1; ; true
|
cat; meow; 1; ; true
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Trim strings
|
||||||
|
Given a sample.yml file of:
|
||||||
|
```yaml
|
||||||
|
- ' cat'
|
||||||
|
- 'dog '
|
||||||
|
- ' cow cow '
|
||||||
|
- horse
|
||||||
|
```
|
||||||
|
then
|
||||||
|
```bash
|
||||||
|
yq '.[] | trim' sample.yml
|
||||||
|
```
|
||||||
|
will output
|
||||||
|
```yaml
|
||||||
|
cat
|
||||||
|
dog
|
||||||
|
cow cow
|
||||||
|
horse
|
||||||
|
```
|
||||||
|
|
||||||
## Match string
|
## Match string
|
||||||
Given a sample.yml file of:
|
Given a sample.yml file of:
|
||||||
```yaml
|
```yaml
|
||||||
|
@ -152,6 +152,7 @@ var participleYqRules = []*participleYqRule{
|
|||||||
|
|
||||||
{"Uppercase", `upcase|ascii_?upcase`, opTokenWithPrefs(changeCaseOpType, nil, changeCasePrefs{ToUpperCase: true}), 0},
|
{"Uppercase", `upcase|ascii_?upcase`, opTokenWithPrefs(changeCaseOpType, nil, changeCasePrefs{ToUpperCase: true}), 0},
|
||||||
{"Downcase", `downcase|ascii_?downcase`, opTokenWithPrefs(changeCaseOpType, nil, changeCasePrefs{ToUpperCase: false}), 0},
|
{"Downcase", `downcase|ascii_?downcase`, opTokenWithPrefs(changeCaseOpType, nil, changeCasePrefs{ToUpperCase: false}), 0},
|
||||||
|
simpleOp("trim", trimOpType),
|
||||||
|
|
||||||
{"HexValue", `0[xX][0-9A-Fa-f]+`, hexValue(), 0},
|
{"HexValue", `0[xX][0-9A-Fa-f]+`, hexValue(), 0},
|
||||||
{"FloatValueScientific", `-?[1-9](\.\d+)?[Ee][-+]?\d+`, floatValue(), 0},
|
{"FloatValueScientific", `-?[1-9](\.\d+)?[Ee][-+]?\d+`, floatValue(), 0},
|
||||||
|
@ -146,6 +146,7 @@ var captureOpType = &operationType{Type: "CAPTURE", NumArgs: 1, Precedence: 50,
|
|||||||
var testOpType = &operationType{Type: "TEST", NumArgs: 1, Precedence: 50, Handler: testOperator}
|
var testOpType = &operationType{Type: "TEST", NumArgs: 1, Precedence: 50, Handler: testOperator}
|
||||||
var splitStringOpType = &operationType{Type: "SPLIT", NumArgs: 1, Precedence: 50, Handler: splitStringOperator}
|
var splitStringOpType = &operationType{Type: "SPLIT", NumArgs: 1, Precedence: 50, Handler: splitStringOperator}
|
||||||
var changeCaseOpType = &operationType{Type: "CHANGE_CASE", NumArgs: 0, Precedence: 50, Handler: changeCaseOperator}
|
var changeCaseOpType = &operationType{Type: "CHANGE_CASE", NumArgs: 0, Precedence: 50, Handler: changeCaseOperator}
|
||||||
|
var trimOpType = &operationType{Type: "TRIM", NumArgs: 0, Precedence: 50, Handler: trimSpaceOperator}
|
||||||
|
|
||||||
var loadOpType = &operationType{Type: "LOAD", NumArgs: 1, Precedence: 50, Handler: loadYamlOperator}
|
var loadOpType = &operationType{Type: "LOAD", NumArgs: 1, Precedence: 50, Handler: loadYamlOperator}
|
||||||
|
|
||||||
|
@ -13,6 +13,26 @@ type changeCasePrefs struct {
|
|||||||
ToUpperCase bool
|
ToUpperCase bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func trimSpaceOperator(d *dataTreeNavigator, context Context, expressionNode *ExpressionNode) (Context, error) {
|
||||||
|
results := list.New()
|
||||||
|
for el := context.MatchingNodes.Front(); el != nil; el = el.Next() {
|
||||||
|
candidate := el.Value.(*CandidateNode)
|
||||||
|
|
||||||
|
node := unwrapDoc(candidate.Node)
|
||||||
|
|
||||||
|
if guessTagFromCustomType(node) != "!!str" {
|
||||||
|
return Context{}, fmt.Errorf("cannot trim %v, can only operate on strings. ", node.Tag)
|
||||||
|
}
|
||||||
|
|
||||||
|
newStringNode := &yaml.Node{Kind: yaml.ScalarNode, Tag: node.Tag, Style: node.Style}
|
||||||
|
newStringNode.Value = strings.TrimSpace(node.Value)
|
||||||
|
results.PushBack(candidate.CreateReplacement(newStringNode))
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return context.ChildContext(results), nil
|
||||||
|
}
|
||||||
|
|
||||||
func changeCaseOperator(d *dataTreeNavigator, context Context, expressionNode *ExpressionNode) (Context, error) {
|
func changeCaseOperator(d *dataTreeNavigator, context Context, expressionNode *ExpressionNode) (Context, error) {
|
||||||
results := list.New()
|
results := list.New()
|
||||||
prefs := expressionNode.Operation.Preferences.(changeCasePrefs)
|
prefs := expressionNode.Operation.Preferences.(changeCasePrefs)
|
||||||
|
@ -47,6 +47,17 @@ var stringsOperatorScenarios = []expressionScenario{
|
|||||||
"D0, P[], (!!str)::cat; meow; 1; ; true\n",
|
"D0, P[], (!!str)::cat; meow; 1; ; true\n",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
description: "Trim strings",
|
||||||
|
document: `[" cat", "dog ", " cow cow ", horse]`,
|
||||||
|
expression: `.[] | trim`,
|
||||||
|
expected: []string{
|
||||||
|
"D0, P[0], (!!str)::cat\n",
|
||||||
|
"D0, P[1], (!!str)::dog\n",
|
||||||
|
"D0, P[2], (!!str)::cow cow\n",
|
||||||
|
"D0, P[3], (!!str)::horse\n",
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
skipDoc: true,
|
skipDoc: true,
|
||||||
document: `[!horse cat, !goat meow, !frog 1, null, true]`,
|
document: `[!horse cat, !goat meow, !frog 1, null, true]`,
|
||||||
|
Loading…
Reference in New Issue
Block a user