Como anexar uma linha que não inicia com '' para a linha anterior

2

Eu tenho um log que contém linhas XML. Exemplo de formato abaixo:

<head>
    <body>
        <line>
asdasd</line>
    </body>
</head>

Eu quero verificar o arquivo de log e anexar as linhas que não começam com '<' para a linha anterior. Saída seria como abaixo:

<head>
    <body>
        <line>asdasd</line>
    </body>
</head>

Obrigado

    
por Cyphered 06.11.2015 / 16:09

3 respostas

2

Perl para o resgate!

perl -pe 'print "\n" if /^\s*+</; chomp;' input > output

i.e. a nova linha é removida de cada linha e é impressa quando a próxima linha começa com espaço em branco seguido por < .

Para manter a nova linha final, altere chomp para chomp unless eof ou adicione END { print "\n" }

    
por 06.11.2015 / 16:37
2

Acho que já disse isso antes, mas corro o risco de soar como um disco emperrado. NÃO use expressões regulares para analisar XML. É frágil e propenso a quebrar. Eu perguntaria primeiro - por que você está tentando fazer o que está fazendo? Porque deve ser irrelevante quando se trabalha com o seu XML.

Em vez disso, use um analisador:

#!/usr/bin/env perl
use strict;
use warnings;

use XML::Twig;

my $twig = XML::Twig->parsefile('your_file.xml');

foreach my $elt ( $twig->get_xpath('//#PCDATA') ) {
    $elt->set_text( $elt->trimmed_text );
}

$twig->set_pretty_print('indented_a');
$twig->print;

Isso faz o que você quer ... mas se você está realmente trabalhando com o XML normalmente, esse método trimmed_text provavelmente remove a necessidade desse processamento de qualquer maneira.

    
por 17.11.2015 / 15:51
1

Procedimento sed quase padrão

sed '$!N;s/\n\(\s*[^<[:blank:]]\)//;P;D' log.xml
    
por 06.11.2015 / 16:58