[caracas-pm] [l-linux] sustituir apostrofo x comilla

Ernesto Hernández-Novich emhnemhn at gmail.com
Fri May 14 16:31:41 PDT 2010


On Fri, 2010-05-14 at 12:11 -0430, Pedro Del Medico Piermattei wrote:
> Como hago para cambiar apóstrofos (ambos) por comilla simple?
> 
> Estoy usando lo siguiente y me reporta error:
> 
> perl -p -i -e 's/\‘/\'/g' *.txt && \
> perl -p -i -e 's/\’/\'/g' *.txt

Hay dos problemas aquí. El primero es que el \' no hace lo que tu crees
que hace. La línea de comando que escribiste en realidad se interpreta
como

perl -p -i -e 's/\‘/\'  /g  ' *.txt && perl -p -i -e ' s/\’/\ '/g' *.txt

y eso va a producir varios errores en el shell y en Perl. Lo correcto
sería haber comenzado por escribir

perl -p -i -e "s/‘/'/g" *.txt && perl -p -i -e "s/’/'/g" *.txt

Ambas instrucciones se pueden combinar en una sola, aprovechando el
combinador de unión de expresiones regulares quedando así

perl -p -i -e "s/‘|’/'/g" *.txt

sin embargo esto tampoco funcionaría porque los "apóstrofes" que tu
quieres cambiar son trigrafos UTF-8 (son acentos especiales en algunos
idiomas, que uno puede usar como si fueran comillas). A menos que le
digas a Perl que la entrada (y la salida) están en UTF-8 cuando ejecutas
un one-liner se supone ASCII, así que correrlo de esa forma genera una
"sorprendente" salida en la cual cada apóstrofe se convierte en tres '
en lugar de uno (no es sorprendente si uno medita el "tri" de trigrafo).

Para que puedas hacer el one-liner indicando UTF-8

perl -CIO -i -pe  "s/‘|’/'/g"

Incidentalmente, la solución de Alberto no es correcta porque no está
atacando los trigrafos sino la comilla grave (`, ASCII 103) y el
apóstrofe (', ASCII 39) y eso no es lo que necesitas. Y aunque Alberto
empleara los trigrafos correctos, tampoco funcionaría porque las
expresiones regulares de sed no operan sobre caracteres UTF-8 multibyte.
-- 
Ernesto Hernández-Novich - Linux 2.6.32 i686 - Unix: Live free or die!
Geek by nature, Linux by choice, Debian of course.
If you can't aptitude it, it isn't useful or doesn't exist.
GPG Key Fingerprint = 438C 49A2 A8C7 E7D7 1500 C507 96D6 A3D6 2F4C 85E3



More information about the caracas-pm mailing list