Como remover um caractere de nova linha em uma linha específica através do perl?

0

Eu quero remover um caractere de nova linha em uma linha específica através do comando perl one-liner.

Entrada:

1407233497,1407233514,bar
1407233498,1407233515,foo
mingstats&fmt=n
1407233499,1407233516,foobar

Resultado esperado:

1407233497,1407233514,bar
1407233498,1407233515,foomingstats&fmt=n
1407233499,1407233516,foobar

O que eu tentei até agora?

Esta regex \n(?!\d+,\d+) corresponde exatamente à nova linha que eu quero remover. Mas eu não sei como implementá-lo através do comando perl one-liner. Eu tentei,

perl -pe 's/\n(?!\d+,\d+)//g' file

Mas remove todos os caracteres de nova linha nesse arquivo e, finalmente, imprime o abaixo em uma única linha,

1407233497,1407233514,bar1407233498,1407233515,foomingstats&fmt=n1407233499,1407233516,foobar

Ficarei tão feliz se o comando perl one-liner usar acima de regex ...

    
por Avinash Raj 29.08.2014 / 13:56

2 respostas

3

Tente:

$ perl -00pe 's/\n(?!\d+,\d+)//g' file
1407233497,1407233514,bar
1407233498,1407233515,foomingstats&fmt=n
1407233499,1407233516,foobar

perl leu o arquivo linha por linha, por padrão, com a opção -p , para que seu regex não funcione.

A opção

-00 ativa o modo slurp do parágrafo; sua regex agora pode funcionar em multilinhas.

De perldoc perlrun:

-0[octal/hexadecimal]

specifies the input record separator ($/ ) as an octal or hexadecimal number. If there are no digits, the null character is the separator. Other switches may precede or follow the digits. For example, if you have a version of find which can print filenames terminated by the null character.

...

The special value 00 will cause Perl to slurp files in paragraph mode. Any value 0400 or above will cause Perl to slurp files whole, but by convention the value 0777 is the one normally used for this purpose

    
por 29.08.2014 / 14:12
2
perl -pe 'print "\n" if $c and !/^(?!\d+,\d+)/; $c=chomp; END{print "\n" if $c}' file_name
    
por 29.08.2014 / 14:24