格式化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