Sed

刪除包含特定元素的 XML 節點

  • April 12, 2013

我想從包含元素的 KML 文件中刪除所有地標<tessellate>。應完全刪除以下塊:

<Placemark>
   <styleUrl>#m_ylw-pushpin330</styleUrl>
   <LineString>
       <tessellate>1</tessellate>
       <coordinates>
           0.0000000000000,0.0000000000000,0 0.0000000000000,0.0000000000000,0
       </coordinates>
   </LineString>
</Placemark>

我嘗試了一些非貪婪的 perl 正則表達式,但沒有成功(很多東西與第一個一起被刪除<Placemark>):

sed -r ':a; N; $!ba; s/\n\t*//g' myplaces.kml |
perl -pe 's|<Placemark>.*?<tessellate>.*?</Placemark>||g'

我相信 XML 解析器是要走的路,但是我閱讀了 xmlstarlet 的文件卻一無所獲。所以也歡迎xmlstarlet、python等中的任何解決方案!

xmlstarlet

xmlstarlet ed -d '//Placemark[.//tessellate]' < myplaces.kml

由於kml使用命名空間,您必須先定義它(參見 xmlstarlet 文件

xmlstarlet ed -N 'ns=http://www.opengis.net/kml/2.2' -d '//ns:Placemark[.//ns:tessellate]'

使用perl,您需要將文件作為一個整體進行處理(而不是逐行處理)並將s標誌添加到s///. 即便如此,即使是非貪婪匹配,它仍然會從第一個匹配出現在<Placemark>next</Placemark>之後的 next <tessellate>。所以你需要這樣寫:

perl -0777 -pe 's|(<Placemark>.*?</Placemark>)|
  $1 =~ /<tessellate>/?"":$1|gse'

引用自:https://unix.stackexchange.com/questions/72157