74.格式化xml脚本


格式化xml文件提取内容,下列为示例代码:
<configuration>
    <!-- </artifactItem><groupId>1111</groupId>
       <version>1.0.1.2.333.555</version> </artifactItem>-->
    <artifactItems>
        <artifactItem>
       <groupId>aaa</groupId>
       <artifactId>bbb</artifactId>
    </artifactItem>
    <!-- </artifactItem><groupId>2222</groupId> -->
    <artifactItem>
       <groupId>xxx</groupId>
       <artifactId>yyy</artifactId>
    </artifactItem>
    <!-- </artifactItem><groupId>3333</groupId>
       <version>1.0.1.2.333.555</version> </artifactItem>
       <version>1.0.1.2.333.555</version> </artifactItem>
       <version>1.0.1.2.333.555</version> </artifactItem>
       <version>1.0.1.2.333.555</version> </artifactItem>-->
    <artifactItem>
       <groupId>kkk</groupId>
       <artifactId>zzz</artifactId>
    </artifactItem>
    <!-- </artifactItem><groupId>44444</groupId>
       <version>1.0.1.2.333.555</version> </artifactItem>-->
    </artifactItems>
</configuration>

思路:sed命令过滤 <!-- -->,再将artifactItem值提取出来。
#!/bin/bash
#The script is used to format xml file.
#Date 2021-01-23
file_xml=index.xml
file_dir=/tmp/xml_format
if ! [ -d $file_dir ];then#创建目录用于存放文本
        mkdir -p $file_dir
fi
sed '/<!--.*-->/'d $file_xml >$file_dir/test.xml
#首次过滤将一行的 <!-- -->过滤
egrep -n '<!-- |\-\->' $file_dir/test.xml |awk -F ':' '{print $1}' >$file_dir/test_count.txt
#过滤出<!-- 以及 -->所在行的行号写入计数文本
n=`wc -l $file_dir/test_count.txt |awk '{print $1}'`
#计算count.txt文本总行数
n1=$[$n/2]#<!-- 和-->为成套出现,因此只需过滤1次
z=0
#for循环遍历$n/2遍
for i in `seq 1 "$n1"`
do
        odd=$[$i*2]#偶数行
        even=$[$odd-1]#奇数行
        x=`sed -n "$odd"p $file_dir/test_count.txt`
                #赋值x奇数行的行号数
        y=`sed -n "$even"p $file_dir/test_count.txt`
                #赋值x偶数行的行号数
        x=$[$x-$z]
        y=$[$y-$z]
        z=$[$z+$x-$y+1]
        sed -i "$y,$x"d $file_dir/test.xml
                #sed -i 每次过滤将导致之前的行号发生变化,变化值为$x-$y+1+$z
done
egrep -n 'artifactItem>' $file_dir/test.xml |awk -F ':' '{print $1}' >$file_dir/test_number.txt
#第二次进行计数写入文本number.txt
line=`wc -l $file_dir/test_number.txt |awk '{print $1}'`
#读取number.txt总行数
line1=$[$line/2]
#<artifactItem></artifactItem>成套出现因此$line/2
get_value() {
        sed -n "$1,$2"p $file_dir/test.xml|awk -F '<|>' '{print $2,$3}'  > $file_dir/test_value.xml
        cat $file_dir/test_value.xml |awk '{print"artifactItem:"$1":"$2}'       
}#获取groupId、artifactId值函数
#以下for循环与第一次循环类似筛选:
for k in `seq 1 "$line1"`
do
        number_odd=$[$k*2]
        number_even=$[$number_odd-1]
        number_x=`sed -n "$number_odd"p $file_dir/test_number.txt`
        number_y=`sed -n "$number_even"p $file_dir/test_number.txt`
        number_x=$[$number_x-1]
        number_y=$[$number_y+1]
        get_value $number_y $number_x
done
[ -d $file_dir ] && rm $file_dir/test_*#清除无用文本
运行结果:
sh formatxml.sh
artifactItem:groupId:aaa
artifactItem:artifactId:bbb
artifactItem:groupId:xxx
artifactItem:artifactId:yyy
artifactItem:groupId:kkk
artifactItem:artifactId:zzz

猜你喜欢

转载自blog.51cto.com/11594671/2603612