2012-03-13 20 views
9

estoy usando un script sed muy simple eliminación de comentarios: sed -e 's/--.*$//'Hace. realmente coincide con cualquier personaje?

Funciona muy bien hasta que los caracteres no ASCII están presentes en un comentario, por ejemplo .: -- °. Esta línea no coincide con la expresión regular y no está sustituida.

¿Alguna idea de cómo obtener . para que coincida con cualquier personaje?


Solución:

Desde file dice que es un texto iso8859, LANG variable de entorno debe cambiarse antes de llamar sed: LANG=iso8859 sed -e 's/--.*//' -

Respuesta

2

@ Julio-Guerra: me encontré con una situación similar, tratando de eliminar las líneas como el folowing (tenga en cuenta el carácter Æ) :

--MP_/yZa.b._zhqt9OhfqzaÆC

en un archivo, utilizando

sed 's/^--MP_.*$//g' my_file

La codificación de archivos indicado por el comando Linux file era

file my_file: ISO-8859 text, with very long lines 
file -b my_file: ISO-8859 text, with very long lines 
file -bi my_file: text/plain; charset=iso-8859-1 

Probé su solución, con varias permutaciones (inteligente!); por ejemplo,

LANG=ISO-8859 sed 's/^--MP_.*$//g' my_file

pero ninguno de los que trabajó. Encontré dos soluciones:

  1. La siguiente expresión Perl funcionó, es decireliminado que line:

perl -pe 's/^--MP_.*$//g' my_file

[Para una explicación de las -pe modificadores de línea de comando, consulte esta respuesta StackOverflow:

Perl flags -pe, -pi, -p, -w, -d, -i, -t?]

  1. Alternativamente, después de convertir la codificación del archivo a UTF-8, la expresión sed funcionó (el carácter Æ permaneció, pero ahora estaba codificado en UTF8):

iconv -f iso-8859-1 -t utf8 my_file > my_file.utf8

Como estoy trabajando con un montón (1000), acerca de los correos electrónicos con varias codificaciones, que se someten a tratamiento intermedio (conversiones de bash-guión a UTF-8 no siempre funciona), para mis propósitos "solución 1 "arriba probablemente sea la solución más robusta.

Notas:

  • sed (sed de GNU) v5.26.1 4.4
  • Perl construido para x86_64-linux-hilo multi-
  • sistema x86_64
  • Arch Linux
0

La documentación de El comando z de GNU sed menciona este efecto (énfasis mío):

Este comando vacía el contenido del espacio del patrón. Suele ser lo mismo que 's /.*//', pero es más eficiente y funciona en la presencia de secuencias multibyte no válidas en la secuencia de entrada. POSIX indica que tales secuencias son no emparejado por '.', por lo que no hay forma portátil de borrar los búferes de sed en el medio de la secuencia de comandos en la mayoría de las configuraciones regionales multibyte (incluidas las configuraciones regionales UTF-8).

Parece probable que esté ejecutando sed en un entorno local UTF-8 (u otro multibyte). Deseará establecer LC_CTYPE (que es más fino que LANG, y no afectará la traducción de mensajes de error. Los nombres válidos de la configuración regional normalmente se parecen a en.iso88591 o (para la ubicación de su perfil) fr_FR.iso88591, no solo a la codificación en sí misma - usted podría ser capaz de ver la lista completa con locale -a

Ejemplo:

LC_CTYPE=fr_FR.iso88591 sed -e 's/--.*//' 

Alternativamente, si se sabe que las piezas no de comentario de la línea contienen sólo ASCII, que podría dividir al. línea en un marcador de comentario, imprima la primera parte y descarte el resto:

sed -e 's/--/\n/' -e 'P' -e 'd' 
Cuestiones relacionadas