¿Cómo eliminaría todos los caracteres que no son ascii de un archivo? ¿Habría un comando específico para realizar esto?
grep --colour='auto' -P -n'[^\x00-\x7]' /usr/local/...
Creo que esto encuentra los caracteres dentro del flujo de trabajo, pero ¿cómo eliminaría todas las instancias de los caracteres en cuestión?
text-processing
ascii
Mizole Ni
fuente
fuente
cat -v
para mostrarlos en representación ASCII para ellos. (por ejemplo,^G
para\007
)Respuestas:
Los caracteres ASCII son caracteres en el rango de 0 a 177 (octal) inclusive .
Para eliminar caracteres fuera de este rango en un archivo, use
El
tr
comando es una utilidad que funciona en caracteres individuales , ya sea sustituyéndolos con otros caracteres individuales (transliteración), eliminándolos o comprimiendo ejecuciones del mismo carácter en un solo carácter.El comando anterior leería
file
y escribiría el contenido modificadonewfile
. La-d
opcióntr
hace que la utilidad elimine caracteres (en lugar de transcribirlos) y-c
hace que considere caracteres fuera del intervalo dado (en lugar de dentro).LC_ALL=C
se asegura de que cada valor de byte constituya un carácter válido. Sin ella, algunastr
implementaciones abortarían si encontraran secuencias de bytes que no forman caracteres válidos en la codificación de caracteres de la configuración regional.Para reemplazar el archivo original con el modificado, use
Esto cambia el nombre del nuevo archivo al nombre del archivo anterior después de que se
tr
haya completado con éxito. Sitr
no se completa correctamente, ya sea porque no pudo leer el archivo original o no pudo escribir en el nuevo archivo, el archivo original no se modificará.Alternativamente, para preservar la mayor cantidad posible de los metadatos (permisos, etc.) del archivo original, use
fuente
Con
perl
fuente
Si todo lo que necesita es una expresión regular:
[\x00-\x7F]
que podría aplicar a varias utilidades:Comprenda que sed, awk y perl esperan "archivos de texto" como se define en Unix. Todo funciona bien en este caso. Pero específicamente, awk agrega una nueva línea final (ya sea que exista en el archivo fuente o no) (el uso de printf elimina TODAS las nuevas líneas en la entrada). El tr está diseñado para funcionar con cualquier tipo de archivo. Sin embargo, el NUL (
\0
) no es un carácter válido en un archivo de texto POSIX y debe evitarse:De hecho, muchos caracteres de control generarían otros problemas en algunas condiciones específicas.
Entonces, probablemente necesites
[\x07-\x0d\x20-\x7e]
El rango 7-13 (en decimal) es
\a\b\t\n\v\f\r
(en orden).Un rango similar (probablemente más portátil) podría escribirse como
[^[:space:][:print:]] (similar because it doesn't include
\ a \ b` --bell y retroceso--).Relacionado:
Regex cualquier carácter ASCII
Solución Perl
Archivo de texto Posix
fuente
tr
puede ser cualquier tipo de archivo, no solo archivos de texto.awk
por otro lado, toma un archivo de texto.gensub()
es una extensión gawk. Desearíagsub(...); print
, y usar secuencias octales en lugar de hexadecimales (y LC_ALL = C) para ser (más) portátil.[^\o0]
es hacer coincidir los caracteres que no sean la barra diagonal inversa, o y 0 en POSIXsed
(en todas las implementaciones, excepto GNU sed). Esa no es una limitación de GNUsed
sino una extensión no compatible, por lo que está deshabilitada cuando POSIXLY_CORRECT está en el entorno).