删除"一组xml标签"使用sed

时间:2016-09-23 05:31:40

标签: xml sed

我有大量的xml文件。我想匹配特定的字符串并删除整个相关的标签示例xml

    if let value = response.result.value {
                                    let data = JSON(value)
                                    if let responseDictionary = data.dictionary {
                                        if let commentsArray = responseDictionary["comments"]?.array {
                                            for commentObject in commentsArray {
                                                if let myTest = SingleComment.fromJSON(commentObject){
                                                    self.items.addObject(myJSON)

                                                }
                                            }
self.myTable.reloadData()
                                        }
                                    }
    }

在这个xml中我想匹配3个<server> <servlet-name>default</servlet-name> <servlet-class>servlets.DefaultServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>0</param-value> </init-param> <init-param> <param-name>listings</param-name> <param-value>false</param-value> </init-param> <load-on-startup>1</load-on-startup> </server> 的东西。如果它匹配3件事删除整件事。我在下面尝试了sed命令。

<server>..<servlet-name>default</servlet-name>....</server>

所以在这个东西服务器切断整个东西将被删除。但我想要匹配第3件事也sed -i '/server/,/server/ d' web1.xml 如下面的命令

default

这个命令没有用,但我想要这个

1 个答案:

答案 0 :(得分:2)

正如你的评论中提到的,sed不是解析xml的正确工具。

话虽这么说,如果你别无选择,你可以试试这个(风险自负):

sed '/<server>/{:a;/<\/server>/!{N;ba;}};/<servlet-name>default<\/servlet-name>/d;' web1.xml

合并<server></server>之间的行,如果找到字符串<servlet-name>default</servlet-name>则会删除。

<强>解释

  • /<server>/:如果找到<server>
  • :a:标记a for循环
  • /<\/server>/!:如果找不到</server>
  • N:将下一行添加到模式空间
  • ba:循环到:a标签
  • /<servlet-name>default<\/servlet-name>/:当循环结束时,在模式空间中搜索字符串<servlet-name>default</servlet-name>。如果找到了:
  • d:清理模式空间(即将所有内容从<server>删除到</server>