查找和更改两行文本-正则表达式

时间:2018-06-27 08:30:44

标签: regex xml bash sed

我有一个包含以下内容的xml文件:

<init-param>
    <param-name>listings</param-name>
    <param-value>true</param-value>
</init-param>
<init-param>
    <param-name>showServerInfo</param-name>
    <param-value>false</param-value>
</init-param>

我需要的是找到两行清单&true,然后用清单&false代替

我只想出

sed -i 's/^<param-name>listings<\/param-name>\n<param-value>true<\/param-value>$/<param-name>listings<\/param-name><param-value>false<\/param-value>/g' somefile.xml

感谢您的任何建议。

2 个答案:

答案 0 :(得分:3)

对于输入文件:

$ more input.xml
<root>
        <init-param>
            <param-name>listings</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>showServerInfo</param-name>
            <param-value>false</param-value>
        </init-param>
</root>

您可以使用以下XSLT样式表:

$ more listing_conv.xslt 
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output method="xml" indent="yes" />
    <xsl:strip-space elements="*"/>

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
    </xsl:template>

    <xsl:template match="//init-param[./param-name = 'listings']/param-value">
        <param-value>false</param-value>
    </xsl:template>
</xsl:stylesheet>

说明:

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
    </xsl:template>

这部分将复制XML文件中的所有内容(默认行为),除非您到达XPATH://init-param[./param-name = 'listings']/param-value

    <xsl:template match="//init-param[./param-name = 'listings']/param-value">
        <param-value>false</param-value>
    </xsl:template>

第二部分将使您可以将param-value的值更改为false。

因为XPATH将访问名称为init-param的元素,这些元素具有名为param-name的子元素,其值设置为listings。对于这些元素,您可以访问名为param-value的子元素并将其覆盖为false

输出:

$ xsltproc listing_conv.xslt input.xml 
<?xml version="1.0"?>
<root>
  <init-param>
    <param-name>listings</param-name>
    <param-value>false</param-value>
  </init-param>
  <init-param>
    <param-name>showServerInfo</param-name>
    <param-value>false</param-value>
  </init-param>
</root>

我已经使用xsltproc命令运行XSLT proc,但是您可以将其他命令用作xalan,也可以仅下载saxon解析器jar:saxon9he.jar并运行{{1} }

更多信息:

I need a simple command line program to transform XML using an XSL Stylesheet

答案 1 :(得分:0)

我找到了解决方案。我无法使用XSLT或其他。解决我的问题的方法很简单。您的答案确实非常有用,肯定比我的解决方案要好,但是我需要这种方式。

awk -i inplace '{
    if ($0 ~ /globaltag/) {
        r=1
    }
    if ($0 ~ /listings/) {
        if (r==1) {
            s=1
        }
    } else {
        if($0 ~ /true/) {
            if(s==1){ 
                sub(/true/,"false");
                s=0
                r=0
            }
        } else {
            s=0
        }
    }
    print;
}' file.xml