sed - Eliminar caracteres no ASCII de CSV
awk (11)
Aprecio los consejos que encontré en este sitio.
Pero, en mi Windows 10, tuve que usar comillas dobles para que esto funcione ...
sed -i "s/[/d128-/d255]//g" FILENAME
Notó estas cosas ...
Para FILENAME, toda la ruta / nombre necesita ser citada Esto no funcionó -
%TEMP%/"FILENAME"
Esto hizo -%TEMP%/FILENAME"
sed deja atrás archivos temporales en el directorio actual, llamado sed *
Quiero eliminar todos los caracteres no ASCII de un archivo en su lugar.
Encontré una solución con tr, pero creo que necesito volver a escribir ese archivo después de la modificación.
Necesito hacerlo en lugar con un rendimiento relativamente bueno.
¿Alguna sugerencia?
Como alternativa a sed o perl, puede considerar usar las clases de caracteres ed (1) y POSIX.
Nota: ed (1) lee todo el archivo en la memoria para editarlo en el lugar, por lo que para los archivos realmente grandes debe usar sed -i ..., perl -i ...
# see:
# - http://wiki.bash-hackers.org/doku.php?id=howto:edit-ed
# - http://en.wikipedia.org/wiki/Regular_expression#POSIX_character_classes
# test
echo $''aaa /177 bbb /200 /214 ccc /254 ddd/r/n'' > testfile
ed -s testfile <<< $'',l''
ed -s testfile <<< $''H/ng/[^[:graph:][:space:][:cntrl:]]/s///g/nwq''
ed -s testfile <<< $'',l''
Esto funcionó para mí:
sed -i ''s/[^[:print:]]//g''
Estoy usando un sistema busybox muy mínimo, en el cual no hay soporte para los rangos en las clases de caracteres tr
o POSIX, así que tengo que hacerlo a la vieja usanza. Aquí está la solución con sed
, eliminando TODOS los caracteres no ASCII no imprimibles del archivo:
sed -i ''s/[^a-zA-Z 0-9`~!@#$%^&*()_+/[/]//{}|;''/''':",.//<>?]//g'' FILE
Intenté todas las soluciones y nada funcionó. Lo siguiente, sin embargo, hace:
tr -cd ''/11/12/15/40-/176''
Que encontré aquí:
https://alvinalexander.com/blog/post/linux-unix/how-remove-non-printable-ascii-characters-file-unix
Mi problema lo necesitaba en una serie de programas canalizados, no directamente desde un archivo, así que modifíquelo según sea necesario.
Pruebe tr
lugar de sed
tr -cd ''[:print:]'' < file.txt
Un perl oneliner haría: perl -i.bak -pe ''s/[^[:ascii:]]//g'' <your file>
-i
dice que el archivo se editará en el lugar, y la copia de seguridad se guardará con la extensión .bak
.
# -i (inplace)
LANG=C sed -i ''s/[/d128-/d255]//g'' FILENAME
El rol de la parte LANG=C
es evitar un Invalid collation character
.
Basado en la respuesta de Ivan y el comentario de Patrick.
# -i (inplace)
sed -i ''s/[/d128-/d255]//g'' FILENAME
awk ''{ sub("[^a-zA-Z0-9/"!@#$%^&*|_/[](){}", ""); print }'' MYinputfile.txt > pipe_out_to_CONVERTED_FILE.txt
sed -i ''s/[^[:print:]]//'' FILENAME
Además, esto actúa como dos2unix