Estoy ejecutando los siguientes 2 sed
comandos. El primero agrega caracteres de nueva línea donde los quiero, el segundo también agrega caracteres de nueva línea donde los quiero, PERO también agrega uno adicional al final del archivo donde antes no había ninguno.
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
El uso od -c
en los 3 archivos proporciona el siguiente resultado.
Statement_tmp_1.xml (no \n
al final del archivo)
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 (no \n
al final del archivo)
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
al final del archivo, ¿de dónde vino?)
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
Estoy ejecutando AIX 5.3
Básicamente, o quiero que deje de agregar el extra \n
, o encontrar una forma de eliminarlo.
s|...|&\n|
también?\n
en el lado derecho no es portátil.perl
u otra herramienta que pueda manejar datos binarios.\<LF>
es la forma tradicional y POSIX de agregar un carácter LF.\n
Por lo general, sustituiría unn
personaje en cualquier cosa que no sea GNUsed
.Respuestas:
Debería considerarse afortunado de que AIX haya
sed
agregado los caracteres de nueva línea que faltan.Un archivo no vacío que no termina en un carácter de nueva línea no es un archivo de texto (al menos según la definición POSIX de un archivo de texto) ya que un archivo de texto debe contener líneas y las líneas son un (no demasiado) largo) secuencia de caracteres terminados por un carácter de nueva línea, por lo que el comportamiento de las utilidades de texto como
sed
en él no está especificado y en la práctica varía de implementación a implementación.Algunas
sed
implementaciones habrían descartado esos caracteres espurios después de la última línea.AFAIK, los
xml
archivos están destinados a ser archivos de texto, por lo que eso significa quesed
solo lo arregló por usted.Si necesita que ese archivo no termine en un carácter de nueva línea, puede usar
perl
u otras herramientas que puedan hacer frente a datos que no son de texto.fuente
sed
salida a cualquier otra utilidad estándar de Unix. Honestamente, no me di cuenta desed
esto durante años , ya que las sustituciones de comandos de shell Bourne como$(sed 's/bas/replac/' <<<'basement')
recortar furtivamente la nueva línea final, si hay una. Pero no son momentos en los que sin duda no lo quieren; por ejemplo , manipulando el texto del portapapeles X consed
. Para su información, GNU sed, si está disponible, no agrega una nueva línea de terminación si la usap
con la-n
opción, como se describe en esta respuesta SE .Aquí hay una manera de eliminar la nueva línea final de un archivo usando
dd
:Para probar si un archivo termina con una nueva línea, puede usar:
Y para obtener el tamaño del archivo en bytes use:
fuente
De acuerdo con este manual de AIX, IBM lo
tail
hace-r
siempre, lo que se ve muy bien. Mientras su archivo tenga menos de 20 KB, lo siguiente debería funcionar:fuente