diff --git a/cmd/constant.go b/cmd/constant.go index 7d5d590..b18a9f9 100644 --- a/cmd/constant.go +++ b/cmd/constant.go @@ -11,6 +11,7 @@ var writeInplace = false var writeScript = "" var outputToJSON = false var prettyPrint = false +var explodeAnchors = false var defaultValue = "" var indent = 2 var overwriteFlag = false diff --git a/cmd/read.go b/cmd/read.go index 8b0d997..bd4f297 100644 --- a/cmd/read.go +++ b/cmd/read.go @@ -26,6 +26,7 @@ yq r -- things.yaml '--key-starting-with-dashes.blah' cmdRead.PersistentFlags().StringVarP(&docIndex, "doc", "d", "0", "process document index number (0 based, * for all documents)") cmdRead.PersistentFlags().StringVarP(&printMode, "printMode", "p", "v", "print mode (v (values, default), p (paths), pv (path and value pairs)") cmdRead.PersistentFlags().StringVarP(&defaultValue, "defaultValue", "D", "", "default value printed when there are no results") + cmdRead.PersistentFlags().BoolVarP(&explodeAnchors, "explodeAnchors", "X", false, "explode anchors") return cmdRead } diff --git a/cmd/utils.go b/cmd/utils.go index 14e9a9f..d698252 100644 --- a/cmd/utils.go +++ b/cmd/utils.go @@ -102,11 +102,33 @@ func writeString(writer io.Writer, txt string) error { return errorWriting } +func explode(matchingNodes []*yqlib.NodeContext) error { + for _, nodeContext := range matchingNodes { + var targetNode = yaml.Node{Kind: yaml.MappingNode} + explodedNodes, errorRetrieving := lib.Get(nodeContext.Node, "**") + if errorRetrieving != nil { + return errorRetrieving + } + for _, matchingNode := range explodedNodes { + mergePath := lib.MergePathStackToString(matchingNode.PathStack, appendFlag) + updateCommand := yqlib.UpdateCommand{Command: "update", Path: mergePath, Value: matchingNode.Node, Overwrite: overwriteFlag} + lib.Update(&targetNode, updateCommand, true) + } + nodeContext.Node = &targetNode + } + return nil +} + func printResults(matchingNodes []*yqlib.NodeContext, writer io.Writer) error { if prettyPrint { setStyle(matchingNodes, 0) } + //always explode anchors when printing json + if explodeAnchors || outputToJSON { + explode(matchingNodes) + } + bufferedWriter := bufio.NewWriter(writer) defer safelyFlush(bufferedWriter)