在xml文件中查找和删除特定标记

时间:2017-09-26 14:40:59

标签: regex linux sed grep find

我有以下xml结构:

<filter>
 <filter-name>FooServletFilter</filter-name>
 <filter-class>
    com.foo.web.online.util.csrf.FooServletFilter
 </filter-class>
</filter>

<filter-mapping>
  <filter-name>FooServletFilter</filter-name>
  <url-pattern>/bar/foo/*</url-pattern>
</filter-mapping>   

好吧,我们遇到了紧急情况,需要删除正在生产的这些过滤器。

我想我可以find包含这些过滤器的web.xml文件,并使用sed

删除它们

我可以使用findexec,但sed失败。

#find / -type f -name "web.xml -exec sed -i -e 's/<filter>.*FooServletFilter<\/filter>//g

失败。然后我想在我的本地文件上试用sed

我尝试了很多类似的东西:

sed -i -e 's/<filter>.*FooServletFilter<\/filter>//g' web.xml

但没有运气。

ps:我有多个xml节点。我需要删除有的节点  FooServletFilter

你可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

使用多行时sed命令变得棘手。

这是一个处理\n行分隔符的hacky解决方案。 (按照此处的建议:https://unix.stackexchange.com/questions/26284/how-can-i-use-sed-to-replace-a-multi-line-string

请注意,我假设您要删除整个过滤器块。使用上面的输入字符串进行测试,但可能需要调整多个匹配项。

cat your.xml | tr '\n' '\r' | sed -e 's/<filter>.*FooServletFilter.*<\/filter>//' | tr '\r' '\n' > your_new.xml

答案 1 :(得分:0)

这就是我得到的

gsed '/<filter>/ {:1; {/<\/filter>/!{N; b1;}; h;}; x; /FooServletFilter/!p; d; }' <your file>