mikefarah / yq

yq is a portable command-line YAML, JSON, XML, CSV, TOML and properties processor
https://mikefarah.gitbook.io/yq/
MIT License
12k stars 590 forks source link

Cannot regex match parentheses after the implementation of string interpolation feature in 4.43.1 #2083

Open DMaxter opened 3 months ago

DMaxter commented 3 months ago

Describe the bug When handling regex matching with yq, if we want to match against a parentheses, it is not possible. We always get this error about unclosed interpolation string

Version of yq: >= 4.43.1 Operating system: Linux Installed via: binary release

Input Yaml data.yml:

- name: abc
- name: d(ef)

Command The command you ran:

 yq '.[] | select(.name | test("d\(ef\)"))' data.yml # Works with version 4.42.1 and previous
 yq --string-interpolation '.[] | select(.name | test("d\(ef\)"))' data.yml # Only possible after 4.43.1 but doesn't work, output is the same

Actual behavior

Error: unclosed interpolation string \(

Expected behavior

name: d(ef)

Additional context I think the string interpolation feature is not working well, regex matching is greatly affected here

mikefarah commented 3 months ago

Hey, yep that's a bug. You can turn off string-interpolation using that flag though, you just need to set it to false:

yq --string-interpolation=f '.[] | select(.name | test("d\(ef\)"))' examples/data1.yaml

That said, I'll fix the bug so when a unclosed interpolation is detected, it will skip interpolation (and log a warning) instead of aborting.

DMaxter commented 3 months ago

Is there any usecase where we want string interpolation inside regex matches? I mean, we can always do test("something " + .property + " another something"), right?

mikefarah commented 1 month ago

Fixed in 4.44.3

DMaxter commented 1 month ago

Seems to be working on my end. Thank you