Regex - 2 capturing groups in Bash -


i have bash-script:

#!/bin/bash -e  contents=`echo "$(<testdoc.xml)"`  regex='(?<=name=")(.+)">(.+)(?=<\/block)'  line in $contents         [[ $line =~ $regex ]]         blockname="${bash_rematch[1]}"         blockversion="${bash_rematch[2]}"          echo $blockname         echo $blockversion done 

testdoc.xml contents this:

<?xml version="1.0" encoding="utf-8" standalone="yes"?> <domainmanifest>   <blocks>     <block name="wpf">wpf-13 31.10.2012 / 09:06:55</block>     <block name="vsh">vsh-08 30.10.2012 / 09:12:06</block>     <block name="vbn">vbn-14 15.06.2015 / 13:29:16</block>     <block name="rmv">rmv-27 07.07.2015 / 10:52:57</block>     <block name="zrl">zrl-12 01.07.2011 / 09:23:25</block>     <block name="nph">nph-05 07.07.2008 / 09:36:32</block>     <block name="vdv">20150630</block>     <block name="verbundmetainfo.properties">22.06.2015</block>   </blocks> </domainmanifest> 

when try out regex on https://regex101.com/ said contents works charm. doing wrong? must in bash no?

edit:

script looks this:

#!/bin/bash  regex='(?<=name=")(.+)">(.+)(?=<\/block)'  while read line     echo $line      [[ $line =~ $regex ]]      blockname="${bash_rematch[1]}"     blockversion="${bash_rematch[2]}"      echo $blockname     echo $blockversion done <$1 

which @ least returns lines correctly, yet regex not returning anything. ideas?

edit2:

got working grep , 2 separate regexes:

#!/bin/bash  regex_name='(?<=name=")(.+)(.+)(?=">)' regex_version='(?<=">)(.+)(?=<\/block)'  while read line     echo $line | grep -op $regex_name     echo $line | grep -op $regex_version done <$1 

in bash, loops on strings split on spaces, unless engage in quoting, isn't appropriate file input. want instead more like:

while read line;     [[ $line =~ $regex ]]     blockname="${bash_rematch[1]}"     blockversion="${bash_rematch[2]}"      echo $blockname     echo $blockversion done <testdoc.xml 

good luck!


Comments