unix sed – Elimine el carácter unicode desconocido de los archivos de texto: sed, otros métodos bash / shell

Pregunta:

Necesito buscar y reemplazar todas las apariciones de un carácter desconocido en algunos archivos que tienen el mismo nombre.

Al abrir esos archivos con vi, leí el código <91> para ese personaje. Al abrirlos con nano, leo un "signo de interrogación" en un diamante (rombos negros).

Me gustaría reemplazar ese carácter desconocido con una cita ('). Estoy intentando de muchas formas sin suerte.

Lo intenté:

find ./ -name filename.txt -exec perl -i~ -pe "s/\x91/'/" {} \;



find ./ -name filename.txt -exec sed -i "s/\x91/'/g" {} \;

EDITAR Más información sobre el personaje:

Hexadecimal: 91 68 74 74
Decimal: 145 104 116 116
Octal: 221 150 164 164
Binary: 10010001 01101000 01110100 01110100

LC_ALL=C sed -n l < file

\221

¡Si necesitas más, pregunta!

Respuesta:

Debería echar un vistazo usando hexdump -C y encontrar los bytes a su alrededor. Suponiendo UTF-8, lo que vi muestra como <91> (decimal 145, un punto Unicode sin sentido en el texto) serían dos bytes, 0xc2 y 0x91.

Está implícito que sus sustituciones no funcionaron en absoluto, pero si lo que hizo fue simplemente reemplazar 0x91 con 0x27, habrá invalidado el UTF-8 (el segundo byte de una secuencia de dos bytes siempre tiene el bit alto establecido, es decir, es > = 0x80). Esto podría complicar su análisis, aunque vi entonces debería mostrarlo como ?' .

Dicho esto, probé esto y funciona:

#!/usr/bin/perl
use strict;
use warnings FATAL => qw(all);

my $data = "";
my $file = $ARGV[0];

while (<>) {
    s/\xc2\x91/'/g;
    $data .= $_;
}

open my $out, '>', $file || die "Could not write $file.";
print $out $data;
close $out;  

Si $ARGV[0] existe cuando se hace referencia a <> , perl saca esto de la pila de argumentos y lo toma como una ruta de archivo para usar como entrada (encuentro que los scripts cortos son más fáciles de modificar y trabajar con que una línea, por cierto). Esto se acumula en la memoria (está bien siempre que los archivos no sean masivos), mientras que perl -i cambia el nombre del archivo original para evitar condiciones de carrera de edición en el lugar (ver perldoc perlrun ).

Entonces podrías usar eso:

  find . -name "*.txt" -exec whatever.pl {} +

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım