我有以下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
我可以使用find
和exec
,但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
你可以帮我解决这个问题吗?
答案 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>