• Publicidad

Sustituir carácter unicode en fichero de texto

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Sustituir carácter unicode en fichero de texto

Notapor emencia » 2017-02-23 09:15 @427

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.
Adjuntos
pruebas.xml
(34 Bytes) 273 veces
emencia
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2017-02-23 08:53 @411

Publicidad

Re: Sustituir carácter unicode en fichero de texto

Notapor explorer » 2017-02-24 03:36 @191

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{..}".
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Sustituir carácter unicode en fichero de texto

Notapor emencia » 2017-02-24 04:45 @239

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.
emencia
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2017-02-23 08:53 @411

Re: Sustituir carácter unicode en fichero de texto

Notapor emencia » 2017-02-25 09:43 @446

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?
emencia
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2017-02-23 08:53 @411

Re: Sustituir carácter unicode en fichero de texto

Notapor explorer » 2017-02-25 11:39 @527

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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Sustituir carácter unicode en fichero de texto

Notapor emencia » 2017-02-25 12:44 @572

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.
emencia
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2017-02-23 08:53 @411

Re: Sustituir carácter unicode en fichero de texto

Notapor explorer » 2017-02-25 14:34 @649

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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Sustituir carácter unicode en fichero de texto

Notapor emencia » 2017-02-25 16:39 @735

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.
emencia
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2017-02-23 08:53 @411

Re: Sustituir carácter unicode en fichero de texto

Notapor emencia » 2017-03-07 03:30 @187

Se me había pasado comentarte los resultados. Todo bien, utilizando glob(). Muchísimas gracias por tu ayuda, explorer.

Saludos.
emencia
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2017-02-23 08:53 @411


Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado