Regex-2在Bash中捕获组

Regex-2在Bash中捕获组,regex,bash,Regex,Bash,我有一个bash脚本: #!/bin/bash -e contents=`echo "$(<testdoc.xml)"` regex='(?<=name=")(.+)">(.+)(?=<\/block)' for line in $contents do [[ $line =~ $regex ]] blockname="${BASH_REMATCH[1]}" blockversion="${BASH_REMATCH[2

我有一个bash脚本:

#!/bin/bash -e

contents=`echo "$(<testdoc.xml)"`

regex='(?<=name=")(.+)">(.+)(?=<\/block)'

for line in $contents
do
        [[ $line =~ $regex ]]
        blockname="${BASH_REMATCH[1]}"
        blockversion="${BASH_REMATCH[2]}"

        echo $blockname
        echo $blockversion
done
#/bin/bash-e

contents=`echo“$()(.+)(?=在Bash中,用于空格上拆分的字符串上的循环,除非您使用引号,这不适用于此文件输入。相反,您需要的更像:

while read line; do
    [[ $line =~ $regex ]]
    blockname="${BASH_REMATCH[1]}"
    blockversion="${BASH_REMATCH[2]}"

    echo $blockname
    echo $blockversion
done <testdoc.xml
读取行时;执行以下操作
[$line=~$regex]]
blockname=“${BASH_重新匹配[1]}”
blockversion=“${BASH_重新匹配[2]}”
echo$blockname
echo$blockversion

完成检查此脚本
#!/bin/bash-e contents=`echo“$([不要阅读
for
]的行](mywiki.wooledge.org/DontReadLinesWithFor)解释了为什么需要
while
循环版本。我不相信正则表达式在bash中有效。该网站向您展示了PCRE/etc。但是bash使用了ERE(扩展正则表达式)。谢谢,你说得对。在这个网站上:regex没有验证。需要深入研究两种实现的差异。标记为答案,因为它使用错误的方法读取文件解决了我最初的问题。我后来偶然发现的不同regex实现的问题被解决为“编辑2”在文档的原始帖子中。
#!/bin/bash

regex='(?<=name=")(.+)">(.+)(?=<\/block)'

while read line
do
    echo $line

    [[ $line =~ $regex ]]

    blockname="${BASH_REMATCH[1]}"
    blockversion="${BASH_REMATCH[2]}"

    echo $blockname
    echo $blockversion
done <$1
#!/bin/bash

regex_name='(?<=name=")(.+)(.+)(?=">)'
regex_version='(?<=">)(.+)(?=<\/block)'

while read line
do
    echo $line | grep -oP $regex_name
    echo $line | grep -oP $regex_version
done <$1
while read line; do
    [[ $line =~ $regex ]]
    blockname="${BASH_REMATCH[1]}"
    blockversion="${BASH_REMATCH[2]}"

    echo $blockname
    echo $blockversion
done <testdoc.xml