Estou executando os 2 sed
comandos a seguir . O primeiro adiciona caracteres de nova linha onde eu os quero, o segundo também adiciona caracteres de nova linha onde eu os quero, MAS também adiciona um adicional 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
O uso od -c
em todos os três arquivos fornece a seguinte saída.
statement_tmp_1.xml (não \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 (não \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 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, eu quero que ele pare de adicionar o extra \n
ou encontre uma maneira de removê-lo.
s|...|&\n|
também?\n
no lado direito não é portátil.perl
ou outra ferramenta que possa lidar com dados binários.\<LF>
é a maneira tradicional e POSIX de adicionar um caractere LF.\n
normalmente substituiria umn
personagem em qualquer coisa, exceto GNUsed
.Respostas:
Você deve considerar-se com sorte porque o AIX
sed
adicionou esses caracteres de nova linha ausentes.Um arquivo não vazio que não termine com um caractere de nova linha não é um arquivo de texto (pelo menos conforme a definição POSIX de um arquivo de texto), pois um arquivo de texto deve conter linhas e as linhas são (não muito longa) sequência de caracteres terminados por um caractere de nova linha; portanto, o comportamento dos utilitários de texto como
sed
ele não é especificado e, na prática, varia de implementação para implementação.Alguma
sed
implementação teria descartado esses caracteres espúrios após a última linha.AFAIK, os
xml
arquivos devem ser arquivos de texto, o que significa quesed
apenas foi corrigido.Se você precisar que esse arquivo não termine com um caractere de nova linha, poderá usar
perl
ou outras ferramentas que possam lidar com dados que não são de texto.fonte
sed
saída para qualquer outro utilitário Unix padrão. Honestamente, eu não percebised
isso há anos , já que as substituições de comandos do Bourne shell$(sed 's/bas/replac/' <<<'basement')
cortam furtivamente a nova linha final, se houver uma. Mas não são momentos em que você definitivamente não quer; por exemplo , manipular o texto da área de transferência do X comsed
. FYI, GNU sed, se disponível, não adiciona uma nova linha final se você a usarp
com a-n
opção, conforme descrito nesta resposta SE .Aqui está uma maneira de remover a nova linha final de um arquivo usando
dd
:Para testar se um arquivo termina com uma nova linha, você pode usar:
E para obter o tamanho do arquivo em bytes, use:
fonte
De acordo com esta AIX manual do IBM
tail
faz-r
everse - que parece muito legal. Desde que seu arquivo tenha menos de 20 KB, o seguinte deve funcionar:fonte