【发布时间】:2020-05-06 07:21:38
【问题描述】:
sample.xml 的内容如下所示。
<Name="com.name1.sample.date" level="ERROR"/>
<Name="com.name2.test" level="WARNING">
<Name="com.name3.type.yeah.trace" additivity="false" level="DEBUG">
我正在尝试使用 sed 并在所有行上替换“级别参数”的值。 但是,使用 (*) 作为通配符不适用于模式匹配。
我希望输出如下所示。
<Name="com.name1.sample.date" level="INFO"/>
<Name="com.name2.test" level="WARN">
<Name="com.name3.type.yeah.trace" additivity="false" level="UPDATE">
基本上:
从这个图案
*level="<pattern>"*
到这个图案
*level="<updated>"*
* 可以是任何模式。
我在这里做了一些研究,并且能够使它在开始时适用于通配符,但在结束时不起作用,所以我对每个具有不同结尾的模式进行了特殊处理。下面是我的代码。
sed 's|="'"$logger_type"'".*|="'"$logger_type"'" level="'"$update_check"'"/>|g'
其中 $logger_type 是被引用的名称,其级别应更新为 $update_check 的任何内容
【问题讨论】:
-
这看起来不像是有效的 XML...(而且您应该使用像
xmlstarlet这样的 XML 感知工具或任何与 XML 一起工作的工具,而不是sed。) -
@Shawn 它看起来像 log4j.xml 的一部分或类似的,在真正的 XML 文件中有一个“信封”。如果这是真的,那么
sed就“足够好”来调整文件内容了(结构相当简单)。 -
您是否需要使用一组复杂的规则执行单个替换或一系列替换(例如,
com.name1.sample.date的级别应设置为一个值,com.name2.test的级别应设置为另一个值,以及等等)? -
你是对的。一系列的替换。
-
更新的规则和流程已经开始工作,只是我无法为每种情况(示例中的每一行都是不同的情况)创建一个通用的 sed 命令来处理更新。上面的示例文件只是代码的一个sn-p,以显示每种情况的差异。