bash 或 perl 内联捕获多个模式匹配

bash or perl inline capture of multiple pattern matches

简单的事情:

content='"id":"1234"abcdefg"id":"3456"'

需要获取 id:

perl -le '@m = ( $content =~ /\"id\"\:\"(.*)\"/g); print for @m'

不工作,但需要一个衬里用于汇合 json/output 以供 Ansible 处理。

使用

grep -Po 'id":"\K.*?(?=")' <<< "$content"

-P 启用 perl 正则表达式。
-o 只打印匹配的部分而不是整行。
\K 让 grep 忘记它之前匹配 id":"
.*? 匹配尽可能少的字符 ...
(?=") ... 直到 " 是下一个字符。 " 将不会包含在匹配项中。

示例的输出:

1234
3456

在 Perl 中:

perl -sE 'say for $str =~ /"id":"(.*?)"/g' -- -str="$content"