Sed
刪除包含特定元素的 XML 節點
我想從包含元素的 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'