正则表达式 - 在Bash中捕获2个组

时间:2015-07-17 12:57:17

标签: 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]}"

        echo $blockname
        echo $blockversion
done

testdoc.xml内容如下:

<?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>

当我在https://regex101.com/上使用所述内容试用正则表达式时,它就像一个魅力。我究竟做错了什么? 必须是我的bash中的东西吗?

修改

脚本现在看起来像这样:

#!/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

至少正确返回行,但正则表达式没有返回任何内容。有什么想法吗?

EDIT2:

使用grep和2个独立的正则表达式:

#!/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

1 个答案:

答案 0 :(得分:1)

在Bash中,对于在空格上拆分的字符串上的循环,除非您参与引用,这不适合此文件输入。你想要的更像是:

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

    echo $blockname
    echo $blockversion
done <testdoc.xml
祝你好运!