【问题标题】:Sed Command: Searching pattern with wildcard before and after the target stringSed 命令:在目标字符串前后使用通配符搜索模式
【发布时间】: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="&lt;pattern&gt;"* 到这个图案 *level="&lt;updated&gt;"*

* 可以是任何模式。

我在这里做了一些研究,并且能够使它在开始时适用于通配符,但在结束时不起作用,所以我对每个具有不同结尾的模式进行了特殊处理。下面是我的代码。

sed 's|="'"$logger_type"'".*|="'"$logger_type"'" level="'"$update_check"'"/&gt;|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,以显示每种情况的差异。

标签: linux bash shell unix sed


【解决方案1】:

基本上: 从这个图案 *level="&lt;pattern&gt;"* 到这个图案 *level="&lt;updated&gt;"*

由于您的输入是面向行的,我们可以使用"<i>logger_type</i>" 作为地址 regexp 只处理匹配正则表达式的行;因此,我们可以简化替换模式,只指定level="…",而保留其他属性(如additivity)。

sed /\"$logger_type'"/s/level="\w*"/level="'$update_check\"/ sample.xml

【讨论】:

    猜你喜欢
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 2014-04-26
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多