Página 1 de 1

Sustituir carácter unicode en fichero de texto

NotaPublicado: 2017-02-23 09:15 @427
por emencia
Hola, gente. Mi primer mensaje en el foro.

Tengo un problema al sustituir un carácter de un fichero XML en formato UTF-8 (pruebas.xml, que adjunto). El fichero solo contiene 2 líneas:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Línea 1 ©
Línea 2 

Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Problema:

perl -i.bak -pe "s/\x{00a9}/COPYRIGHT/g" pruebas.xml #FUNCIONA CORRECTAMENTE.
perl -i.bak -pe "s/\x{2028}/L SEPARATOR/g" pruebas.xml #NO FUNCIONA.

Os aseguro que he buscado por muchos sitios y no he encontrado la solución. ¿Alguno podría ayudarme? :( Gracias de antemano.

Saludos.

Re: Sustituir carácter unicode en fichero de texto

NotaPublicado: 2017-02-24 03:36 @191
por explorer
Bienvenida a los foros de Perl en Español, emencia.

Si el archivo está en formato UTF-8 se debería procesar de esa manera, pero... supongamos que queremos procesarlo como una ristra de bytes.

Entonces, veamos primero el aspecto del archivo, por dentro:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
$ hexdump -C pruebas.xml
00000000  ef bb bf 0d 0a 4c c3 ad  6e 65 61 20 31 20 c2 a9  |.....L..nea 1 ..|
00000010  0d 0a 4c c3 ad 6e 65 61  20 32 20 e2 80 a8 0d 0a  |..L..nea 2 .....|
*
00000022
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

y ya vemos que los caracteres especiales son "c2a9" y "e280a8".

Entonces, esto funciona:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
$ perl -pe "s/\x{c2}\x{a9}/COPYRIGHT/g; s/\x{e2}\x{80}\x{a8}/L SEPARATOR/g;" pruebas.xml

Línea 1 COPYRIGHT
Línea 2 L SEPARATOR
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Como ves, estamos poniendo cada byte por separado con "\x{..}".

Re: Sustituir carácter unicode en fichero de texto

NotaPublicado: 2017-02-24 04:45 @239
por emencia
explorer, tengo que quitarme el sombrero. Es exactamente lo que necesitaba. Quizá debería haber publicado en el hilo de Perl básico. Todavía me queda mucho por aprender. :mrgreen:

Muchísimas gracias.

Re: Sustituir carácter unicode en fichero de texto

NotaPublicado: 2017-02-25 09:43 @446
por emencia
Me funciona perfecto para un solo fichero, pero estoy intentando sustituir el carácter en varios xml de una carpeta y no hay manera.

He hecho muchas pruebas con ejemplos de este foro y encontradas en Internet y me da el error de Can't open *.xml: Invalid argument :evil:

¿Tendré algo mal configurado? Utilizo la última versión estable (y portable) de Strawberry Perl sobre Windows10.

Algunos ejemplos que he probado:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
perl -p -i -e "s[mi familia][nosotros]g" *.xml
perl -pi'.bak' -e 's/d01/d02/' *.dat *.out
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


¿Qué estoy haciendo mal?

Re: Sustituir carácter unicode en fichero de texto

NotaPublicado: 2017-02-25 11:39 @527
por explorer
Da la sensación de que el shell de Windows no está haciendo una expansión de la expresión '*.xml'.

Obviamente, estamos hablando de que en el directorio donde estamos trabajando hay archivos que responden al patrón '*.xml'.

Compruébalo con el comando dir *.xml

Puede que ese shell tenga desactivado ese modo de expansión.

Re: Sustituir carácter unicode en fichero de texto

NotaPublicado: 2017-02-25 12:44 @572
por emencia
Sí, claro: en esa carpeta tengo 4 xml. La orden funciona con

perl -pi'.bak' -e "s/\x{e2}\x{80}\x{a8}/L SEPARATOR/g;" prueba.xml

Pero no con

perl -pi'.bak' -e "s/\x{e2}\x{80}\x{a8}/L SEPARATOR/g;" *.xml

:oops:

Además, he probado en otro equipo y me ocurre lo mismo.

Re: Sustituir carácter unicode en fichero de texto

NotaPublicado: 2017-02-25 14:34 @649
por explorer
Creo que ya sé qué pasa... El problema es que el shell de Windows no hace expansión del carácter '*' ( https://msdn.microsoft.com/en-us/library/8bch7bkk.aspx ) salvo que vaya al final del patrón.

Es decir... que es la propia aplicación la que debe hacer la expansión...
using wildcard character * in perlscript command line

En Perl tienes glob()... pero va a complicarte el hacerlo todo en una sola línea.

Te veo haciendo un pequeño programa para resolver tu problema. En el último enlace que te he puesto hay ejemplos para usar glob() por los argumentos indicados por @ARGV.

Cada día me gusta más haber olvidado Windows ;)

De todas maneras... recuerda que en Windows debes usar siempre comillas dobles, en la línea de comandos.

Re: Sustituir carácter unicode en fichero de texto

NotaPublicado: 2017-02-25 16:39 @735
por emencia
Ok, entendido. No me importa el no poder hacerlo en una sola línea. Hoy ya no me da tiempo a mirarlo, pero mañana haré pruebas con glob() y te contaré resultados. Muchas gracias por tu ayuda.

Saludos.

Re: Sustituir carácter unicode en fichero de texto

NotaPublicado: 2017-03-07 03:30 @187
por emencia
Se me había pasado comentarte los resultados. Todo bien, utilizando glob(). Muchísimas gracias por tu ayuda, explorer.

Saludos.