我想从包含元素< tessellate>的KML文件中删除所有地标.应完全删除以下块:
#m_ylw-pushpin330
1
0.0000000000000,0.0000000000000,0 0.0000000000000,0.0000000000000,0
我已经尝试了一些非贪婪的perl正则表达式,没有运气(很多东西与第一个< Placemark>一起删除):
sed -r ':a; N; $!ba; s/\n\t*//g' myplaces.kml |
perl -pe 's|.*?.*?||g'
我相信XML解析器是可行的方法,但我阅读了xmlstarlet的文档并且无处可去.所以xmlstarlet,python等中的任何解决方案也欢迎!
解决方法:
使用xmlstarlet:
xmlstarlet ed -d '//Placemark[.//tessellate]' < myplaces.kml
xmlstarlet ed -N 'ns=http://www.opengis.net/kml/2.2' -d '//ns:Placemark[.//ns:tessellate]'
使用perl,您需要整个处理文件(不是逐行处理)并将s标志添加到s ///.即便如此,即使是非贪婪的匹配,它仍将匹配第一个< Placemark>上一个< / Placemark>在下一个< tessellate>之后发生.所以你需要写它像:
perl -0777 -pe 's|(.*?)|
$1 =~ //?"":$1|gse'
标签:python,perl,xml,sed,regular-expression
来源: https://codeday.me/bug/20190812/1643474.html