Найти и изменить две строки текста - регулярное выражение - PullRequest
0 голосов
/ 27 июня 2018

У меня есть 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 голосов
/ 28 июня 2018

Я нашел решение. Я не смог использовать XSLT или другие. То, что решило мою проблему, было просто awk. Ваши ответы были действительно хорошими и полезными, наверняка лучше, чем мое решение, но мне это нужно было так.

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
0 голосов
/ 27 июня 2018

Для входного файла:

$ 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, но вы можете использовать другие команды как xalan или вы можете просто скачать jar саксонского парсера: saxon9he.jar и запустить java -jar saxon9he.jar <attributes>

Дополнительная информация:

Мне нужна простая программа командной строки для преобразования XML с использованием таблицы стилей XSL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...