我有大量的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
这个命令没有用,但我想要这个
答案 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>