【问题标题】:find and delete specific tags in an xml file查找和删除 xml 文件中的特定标签
【发布时间】:2018-03-07 20:32:51
【问题描述】:

我有以下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 删除它们

我对@9​​87654325@ 和exec 很好,但对sed 失败了。

#find / -type f -name "web.xml -exec sed -i -e 's/&lt;filter&gt;.*FooServletFilter&lt;\/filter&gt;//g

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

我尝试了很多类似以下的方法:

sed -i -e 's/&lt;filter&gt;.*FooServletFilter&lt;\/filter&gt;//g' web.xml

但没有运气。

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

你能帮我解决这个问题吗?

【问题讨论】:

  • edit 你的问题显示给定输入的预期输出。您的输入使您看起来只需要删除确切的字符串&lt;filter-name&gt;FooServletFilter&lt;/filter-name&gt; - 如果不是这种情况,请提供更真实的示例输入/输出,否则您最终会找到解决问题的方法没有。展示一个难以处理的案例,而不是微不足道的晴天案例。正确的解决方案不会涉及 sed,因此您至少应该用 awk 标记它。

标签: regex linux sed grep find


【解决方案1】:

这就是我得到的

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

【讨论】:

    【解决方案2】:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-26
      • 2020-12-20
      • 1970-01-01
      相关资源
      最近更新 更多