我有这个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
答案 0 :(得分:1)
在Bash中,对于在空格上拆分的字符串上的循环,除非您参与引用,这不适合此文件输入。你想要的更像是:
while read line; do
[[ $line =~ $regex ]]
blockname="${BASH_REMATCH[1]}"
blockversion="${BASH_REMATCH[2]}"
echo $blockname
echo $blockversion
done <testdoc.xml
祝你好运!