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