unix 从KML文件中移除匹配的嵌套元素标记

wwwo4jvm  于 2022-11-23  发布在  Unix
关注(0)|答案(3)|浏览(157)

我尝试从KML文件中删除下面的代码部分,理想情况下使用简单的Bash/sed代码。
我熟悉使用sed删除XML标记,但不确定如何删除与特定名称匹配的子标记。
为了重新迭代,我需要匹配并从KML文件中删除整个“Overlay”<Folder></Folder>标签。

尝试用于分析所需模式匹配的Bash代码:

grep -B 1 "<name>Overlay</name>" -A 9

KML代码:

<Folder>
  <name>Overlay</name>
  <open>0</open>
  <Style>
    <ListStyle>
    <listItemType>check</listItemType>
    <bgColor>00ffffff</bgColor>
    <maxSnippetLines>2</maxSnippetLines>
    </ListStyle>
  </Style>
</Folder>
ru9i0ody

ru9i0ody1#

这可能对你有用(GNU sed):

sed '/<Folder>/{:a;N;/<\/Folder>/!ba;/<name>Overlay<\/name>/d}' file

收集<Folder></Folder>范围内的行,如果集合中包含<name>Overlay</name>,则将其删除。

x6yk4ghg

x6yk4ghg2#

建议使用一行gawk(大多数Linux机器中的正常awk)脚本:

gawk '/<Folder>/,/<\/Folder>/{next}1' input.kml
0lvr5msh

0lvr5msh3#

yq可用于您的任务。
它是一个YAML处理器,也可以处理XML,语法类似于jq
就我对你的理解而言,你想删除所有的元素,包括它的子数据,这些元素的子元素是<name> = 'Overlay'
NAME=Overlay yq --input-format xml --output-format xml e 'del(.. | select(type == "!!map") | select(.name == env(NAME)))' $INPUTFILE

输入

<root>
  <Folder>
    <name>Data 1</name>
  </Folder>
  <Folder>
    <name>Overlay</name>
    <open>0</open>
    <Style>
      <ListStyle>
      <listItemType>check</listItemType>
      <bgColor>00ffffff</bgColor>
      <maxSnippetLines>2</maxSnippetLines>
      </ListStyle>
    </Style>
  </Folder>
  <Folder>
    <name>Data 2</name>
  </Folder>
</root>

输出

<root>
  <Folder>
    <name>Data 1</name>
  </Folder>
  <Folder>
    <name>Data 2</name>
  </Folder>
</root>

相关问题