Notepad ++ Localizar e substituir: número variável de linhas curinga?

1

Eu tenho um problema complicado. Eu preciso fazer uma pequena alteração em um grande número de arquivos xml (500+). A mudança envolve a mudança de um valor de "falso" para "verdadeiro". A linha que precisa mudar é assim:

<SizeIsMeasuredLineLine>false</SizeIsMeasuredLineLine>

E isso precisa se tornar:

<SizeIsMeasuredLineLine>true</SizeIsMeasuredLineLine>

Infelizmente, há inúmeras instâncias desse conjunto de tags em cada arquivo, portanto, não podemos encontrar e substituir simples. O que torna esse conjunto de tags único é que eles vêm algumas linhas depois:

<CID>ITEMNAME.BUS.ITEMNAME.DKV</CID>

No entanto, cada arquivo tem um nome de item diferente, então usei curingas para filtrá-los.

<CID>.*BUS..*.DKV</CID>

O problema é que o número de linhas entre a parte CID e a linha que precisa mudar não é consistente de arquivo para arquivo. Eu preciso encontrar uma maneira de separar as linhas entre as linhas curinga e substituir a linha Size.

Alguma ideia? Eu já tentei:

<CID>.*BUS..*.DKV</CID>.*?<SizeIsMeasuredLineLine>true</SizeIsMeasuredLineLine>

Mas, por algum motivo, isso não funcionou. Obrigado antecipadamente!

Editar em resposta ao comentário:

Basicamente, o que estou dizendo é que o código é assim:

<CID>ITEMNAME.BUS.ITEMNAME.DKV</CID>
<tag>Some Number of Other lines</tag>
<tag>Some Number of Other lines</tag>
<tag>Some Number of Other lines</tag>
<SizeIsMeasuredLineLine>false</SizeIsMeasuredLineLine>

E outras seções no código parecem:

<CID>ITEMNAME.COLR.ITEMNAME.FCLR</CID>
<tag>Some Number of Other lines</tag>
<tag>Some Number of Other lines</tag>
<tag>Some Number of Other lines</tag>
<SizeIsMeasuredLineLine>false</SizeIsMeasuredLineLine>

em outros lugares no código. Então, estou usando a linha CID .BUS .DKV como ponto de partida. Basicamente eu preciso mudar a primeira ocorrência da linha SizeisMeasured que vem diretamente após a linha CID .BUS .DKV. Mas há muitas outras linhas intermediárias (nenhuma das quais é consistente de arquivo para arquivo) com as quais eu não me importo e estão atrapalhando a minha pesquisa.

    
por LittleScarfGirl 15.04.2015 / 20:07

2 respostas

1

Você pode usar lookahead negativo como este. Pesquisar

(?!<CID>.*BUS..*.DKV</CID>(.*?))<SizeIsMeasuredLineLine>false</SizeIsMeasuredLineLine>

e substitua por

<SizeIsMeasuredLineLine>false</SizeIsMeasuredLineLine>

Expressão regular, correspondendo. nova linha

Lookahead negativo (?!a) e Lookbehind negativo (?<!a) , também são referenciados também como Lookaround. Lookaround compara os caracteres, mas desiste da correspondência, retornando apenas o resultado: match ou no match.

Você pode encontrar mais aqui Asserções Lookahead e Lookbehind Zero-Length

    
por 15.04.2015 / 20:52
0

Analisar XML ao mesmo tempo que honra a hierarquia com Expressões Regulares é desnecessariamente difícil. Eu usaria uma ferramenta completamente diferente que é explicitamente projetada para o que você está tentando fazer, que é transformar XML. Eu estou falando sobre o XSLT. Então, aqui está a minha solução para o seu problema usando XSLT. Há vários sites que você pode usar para converter seu XML com XSLT ou executar XSLT localmente.

O problema seria mais fácil se cada um de seus grupos (CID seguido por SizeIsMeasuredLineLine) estivesse dentro de um único pai, mas o código abaixo analisa o primeiro irmão CID anterior para ver qual valor ele possui. Se houver um valor correspondente à expressão regular (ITEMNAME. [^.] +. ITEMNAME .. +), ele alterará o falso para verdadeiro. Todos os outros elementos são simplesmente copiados para a saída.

<xsl:stylesheet 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">

<xsl:output method="xml" indent="yes"/>

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

<xsl:template match="SizeIsMeasuredLineLine[matches(preceding-sibling::CID[1], 'ITEMNAME\.[^.]+\.ITEMNAME\..+')]">
   <xsl:copy>TRUE</xsl:copy>
</xsl:template>

Aqui está o exemplo de XML que criei para testar o acima:

    <?xml version="1.0" encoding="UTF-8"?>
<parent>
    <CID>ITEMNAME.BUS.ITEMNAME.DKV</CID>
    <tag>Some Number of Other lines</tag>
    <tag>Some Number of Other lines</tag>
    <tag>Some Number of Other lines</tag>
    <SizeIsMeasuredLineLine>false</SizeIsMeasuredLineLine>
    <CID>ITEMNAME.COLR.ITEMNAME.FCLR</CID>
    <tag>Some Number of Other lines</tag>
    <tag>Some Number of Other lines</tag>
    <tag>Some Number of Other lines</tag>
    <SizeIsMeasuredLineLine>false</SizeIsMeasuredLineLine>
    <CID>ITEMNAME.BUS.122.DKV</CID>
    <tag>Some Number of Other lines</tag>
    <tag>Some Number of Other lines</tag>
    <tag>Some Number of Other lines</tag>
    <SizeIsMeasuredLineLine>false</SizeIsMeasuredLineLine>
    <CID>ITEMNAME.COLR.ITEMNAME.FCLR</CID>
    <tag>Some Number of Other lines</tag>
    <tag>Some Number of Other lines</tag>
    <tag>Some Number of Other lines</tag>
    <SizeIsMeasuredLineLine>false</SizeIsMeasuredLineLine>
    <CID>ITEMNAME.BUS.44.DKV</CID>
    <tag>Some Number of Other lines</tag>
    <tag>Some Number of Other lines</tag>
    <tag>Some Number of Other lines</tag>
    <SizeIsMeasuredLineLine>false</SizeIsMeasuredLineLine>
    <CID>ITEMNAME.COLR.ITEMNAME.FCLR</CID>
    <tag>Some Number of Other lines</tag>
    <tag>Some Number of Other lines</tag>
    <tag>Some Number of Other lines</tag>
    <SizeIsMeasuredLineLine>false</SizeIsMeasuredLineLine>
    <CID>ITEMNAME.BUS.33.DKV</CID>
    <tag>Some Number of Other lines</tag>
    <tag>Some Number of Other lines</tag>
    <tag>Some Number of Other lines</tag>
    <SizeIsMeasuredLineLine>false</SizeIsMeasuredLineLine>
    <CID>ITEMNAME.COLR.ITEMNAME.FCLR</CID>
    <tag>Some Number of Other lines</tag>
    <tag>Some Number of Other lines</tag>
    <tag>Some Number of Other lines</tag>
    <SizeIsMeasuredLineLine>false</SizeIsMeasuredLineLine>
</parent>
    
por 26.04.2015 / 07:15