使用sed替换字符串 - 仅在模式匹配后

时间:2016-01-22 20:07:53

标签: regex xml sed

我有以下XML:

<xml>

    <bean id="bean1"
         class="class1"
         singleton="false">
        <property name="dbPoolName" value="pool"/>
        <property name="dirName" value="myDir"/>
        <!--              <property name="MyProperty" value="5000"/> -->

    </bean>

    <bean id="bean2"
         class="class2"
         singleton="false">
        <property name="dbPoolName" value="pool"/>
        <property name="dirName" value="myDir"/>
        <!--              <property name="MyProperty" value="5000"/> -->

    </bean>

    <bean id="bean3"
         class="class3"
         singleton="false">
        <property name="dbPoolName" value="pool"/>
        <property name="dirName" value="myDir"/>
        <!--              <property name="MyProperty" value="5000"/> -->

    </bean>
</xml>

我需要取消注释元素:

<!--              <property name="MyProperty" value="5000"/> -->

只有id为“bean3”的bean内部。然后我需要修改它的值,使其为50而不是5000。

我尝试使用以下命令:

grep -A 4 "bean3" file.xml | sed 's/<!--//' | sed 's/-->//' | sed 's/5000/50/'

但我无法将其替换为文件。

我应该使用sed和/或grep吗?

3 个答案:

答案 0 :(得分:2)

如果你正在使用GNU sed,你可以使用一个命令来完成所有操作:

sed '/bean3/,+5s/<!-- *\|-->//g; /bean3/,+5s/5000/50/' file.xml

您只需要运行sed命令的一个实例。单个sed命令用分号;分隔。在这种情况下,我们只需要两个sed命令:

  1. 第一个使用空格字符串替换<!--(可选地后跟空格)和--> - 使用替换\|运算符和g(全局)修饰符。
  2. 第二个只是将5000替换为50
  3. /bean3/,+5范围是GNU扩展;这确保了上述替换仅在第一次出现bean3之后的5行上执行。此范围用于两个替换命令。

    如果您确信sed命令可以执行您想要的操作,则可以使用-i / --in-place选项更改file.xml

答案 1 :(得分:0)

以下是一个AWK脚本,用bean扫描id="bean3"标记并取消注释并将"5000"更改为"50",直到下一个bean标记:< / p>

#!/usr/bin/awk

BEGIN{ in_bean3 = 0 }
$0~/<bean / {  # match start of bean tag
    if ( $0 ~ "id=\"bean3\"" ) {
        # Set flag for desired context
        in_bean3 = 1
        print
        next
    } else {  # clear flag
        in_bean3 = 0
    }
}
in_bean3 {  # in desired context
    sub(/<!-- */, "")
    sub(/ *-->/, "")
    sub(/"5000"/, "\"50\"")
}
1

请注意,最后1执行打印行的默认操作。

答案 2 :(得分:0)

$ awk '/<bean id=/{f=(/bean3/?1:0)} f&&gsub(/<!-- *| *-->/,""){sub(/00/,"")} 1' file
<xml>

    <bean id="bean1"
         class="class1"
         singleton="false">
        <property name="dbPoolName" value="pool"/>
        <property name="dirName" value="myDir"/>
        <!--              <property name="MyProperty" value="5000"/> -->

    </bean>

    <bean id="bean2"
         class="class2"
         singleton="false">
        <property name="dbPoolName" value="pool"/>
        <property name="dirName" value="myDir"/>
        <!--              <property name="MyProperty" value="5000"/> -->

    </bean>

    <bean id="bean3"
         class="class3"
         singleton="false">
        <property name="dbPoolName" value="pool"/>
        <property name="dirName" value="myDir"/>
        <property name="MyProperty" value="50"/>

    </bean>
</xml>