Como faço para parar o sed de adicionar caracteres extra de nova linha?

14

Estou executando os comandos 2 sed a seguir. O primeiro adiciona caracteres de nova linha onde eu quero, o segundo também adiciona caracteres de nova linha onde eu quero, mas também adiciona um extra no final do arquivo, onde não havia um antes.

sed -e 's|\<LIST_G_STATEMENT>|&\
|g' ${XMLDIR}/statement_tmp_1.xml > ${XMLDIR}/statement_tmp_2.xml

sed -e 's|\</LIST_G_STATEMENT>|&\
|g' ${XMLDIR}/statement_tmp_2.xml > ${XMLDIR}/statement_tmp_3.xml

Usar od -c em todos os três arquivos fornece a seguinte saída.

statement_tmp_1.xml (sem \n no final do arquivo)

1314700    T   A   T   E   M   E   N   T   >   <   /   L   I   S   T   _
1314720    G   _   S   T   A   T   E   M   E   N   T   >   <   /   G   _
1314740    S   E   T   U   P   >   <   /   L   I   S   T   _   G   _   S
1314760    E   T   U   P   >   <   /   A   R   X   S   G   P   O   >
1314777

statement_tmp_2.xml (sem \n no final do arquivo)

1314700    S   T   A   T   E   M   E   N   T   >   <   /   L   I   S   T
1314720    _   G   _   S   T   A   T   E   M   E   N   T   >   <   /   G
1314740    _   S   E   T   U   P   >   <   /   L   I   S   T   _   G   _
1314760    S   E   T   U   P   >   <   /   A   R   X   S   G   P   O   >
1315000

statement_tmp_3.xml ( \n no final do arquivo - de onde ele veio?)

1314700    S   T   A   T   E   M   E   N   T   >   <   /   L   I   S   T
1314720    _   G   _   S   T   A   T   E   M   E   N   T   >  \n   <   /
1314740    G   _   S   E   T   U   P   >   <   /   L   I   S   T   _   G
1314760    _   S   E   T   U   P   >   <   /   A   R   X   S   G   P   O
1315000    >  \n
1315002

Estou executando o AIX 5.3

Basicamente, quero que ele pare de adicionar o \n extra ou encontre uma maneira de removê-lo.

    
por jonnohudski 04.11.2013 / 11:45

3 respostas

8

Você deve se considerar com sorte que AIX sed tenha adicionado os caracteres de nova linha ausentes.

Um arquivo não vazio que não termina em um caractere de nova linha não é um arquivo de texto (pelo menos conforme a definição POSIX de um arquivo de texto) como um arquivo de texto deve conter linhas e linhas são (não longa seqüência) de caracteres terminados por um caractere de nova linha, portanto o comportamento de utilitários de texto como sed não é especificado e, na prática, varia de implementação para implementação.

Alguma implementação sed teria descartado esses caracteres espúrios após a última linha.

AFAIK, xml arquivos devem ser arquivos de texto, o que significa que sed apenas corrigiu para você.

Se você precisar que o arquivo não seja encerrado em um caractere de nova linha, use perl ou outras ferramentas que possam lidar com dados que não sejam de texto.

perl -pe 's|<LIST_G_STATEMENT>|$&\n|g'
    
por 04.11.2013 / 14:50
0

Aqui está uma maneira de remover a nova linha final de um arquivo usando dd :

printf "" | dd  of='/path/to/file' seek=<filesize_in_bytes - 1> bs=1 count=1

Para testar se um arquivo termina com uma nova linha, você pode usar:

tail -c 1 /path/to/file | tr -dc '\n' | wc -c

E para obter o tamanho do arquivo em bytes, use:

wc -c < /path/to/file
    
por 29.11.2013 / 15:31
0

De acordo com este manual do AIX O tail da IBM faz -r everse - o que parece muito legal. Desde que seu arquivo tenha menos de 20 KB, o seguinte deve funcionar:

tail -r <file | dd bs=1 skip=1 | tail -r >file.new
    
por 21.05.2014 / 02:52

Tags