我有以下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
你能帮我解决这个问题吗?
最佳答案
sed
命令在处理多行时变得棘手。
这是一个处理\n
行分隔符的复杂解决方案。(此处建议: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