¿Por qué sed no genera texto?

1

Tengo un archivo de texto del que necesito eliminar las comillas dobles. Encontré esta pregunta que sugirió usar lo siguiente:

sed 's/"//g' < infile > outfile

Entiendo lo que está haciendo ya que estoy familiarizado con Vim. Pero el archivo de salida tiene cero bytes después de que se ejecuta el comando.

Probé la otra sugerencia de esa pregunta:

tr -d \" < infile > outfile

Esto produce un error:

tr: Illegal byte sequence

Tenga en cuenta que cuando abro el archivo en MacVim y lo uso

:%s /"//g

funciona perfectamente.

¿Hay alguna diferencia en sed de macOS? ¿Alguna otra sugerencia sobre cómo puedo hacer esto?

    
pregunta Chuck 26.03.2018 - 23:29

2 respuestas

2

Aparentemente, el archivo está en formato UTF-16, pero la mayoría de las herramientas de manipulación de texto en macOS no saben cómo trabajar con eso y lo harán si lo intentan. UTF-16 utiliza dos bytes por carácter; para caracteres ASCII simples como " , es el código ASCII de un solo byte seguido de un byte nulo. Algo como tr -d \" eliminará el primer byte, dejando un byte nulo perdido y eliminando el resto del archivo en un byte.

Creo que puede hacer que Perl funcione en UTF-16 (consulte aquí ), pero no estoy seguro de los pros y contras. Este podría funcionar (basado en this ):

perl -pe 'BEGIN { binmode $_, ":raw:encoding(UTF-16LE)" for *STDIN, *STDOUT }; s/"//g;' infile >outfile

También puedes convertirlo a UTF-8 y volver con

iconv -f UTF-16LE -t UTF-8 infile | tr -d \" | iconv -f UTF-8 -t UTF-16LE >outfile

Si no es necesario que la salida esté en UTF-16, puedes dejar fuera el último iconv .

    
respondido por el Gordon Davisson 27.03.2018 - 03:12
1

Bueno, no sé exactamente por qué está ocurriendo este problema, aunque encontré un poco más de información here y here , ninguno de los cuales funcionó. Creo que es la codificación y que LC_CTYPE=C podría estar en el camino correcto, pero convirtió el texto en algo completamente diferente debido a algún tipo de problema de codificación.

En cualquier caso, lo resolví, por ahora, al menos, con esto:

vim -c '%s /"//g|wq' infile
    
respondido por el Chuck 27.03.2018 - 00:10

Lea otras preguntas en las etiquetas