[CentOS-es] combinar comandos find y sed

Eduardo Grosclaude eduardo.grosclaude en gmail.com
Mie Nov 10 09:56:11 EST 2010


2010/11/10 victor santana <reparaciononline en gmail.com>:
> Hola a tod en s tengo que hacer una sustitución masiva de una linea que se
> repite en muchas páginas. Pero tengo el problema que no me lo está haciendo
> al ejecutar el siguiente comando:
>  find . -type f -name '*.php' | xargs sed -i 's#<base href="http://<? echo
> $_SERVER\['SERVER_NAME'\]; ?>/es/" />#<base
> href="http://<?=$_SERVER\['SERVER_NAME'\]?>/"
> />#g' *.php
>
> Al  principo mi problema era escapar las barras / para la sustitución, como
> veis lo conseguí sustituyendo por # , luego mi problema eran los corchetes y
> veis que escapé los corchetes con \ pero ahora la variable global de
> php $_SERVER['SERVER_NAME'] tiene la comilla simple ' que al escapar con \'
> no me está funcionando.
>
> ¿Alguna idea?

1. Parecería que el problema es que \' en awk es una secuencia de
escape con su propio significado. Qué pasa si reemplazas las comillas
simples exteriores, de la expresión que quieres ejecutar, por comillas
dobles, y escapas las dobles adentro? Es decir:

find . -type f -name '*.php' | xargs sed -i "s#<base href=\"http://<?
echo $_SERVER\['SERVER_NAME'\]; ?>/es/\" />#<base
href=\"http://<?=$_SERVER\['SERVER_NAME'\]?>/\" />#g" *.php

Como ahora hay comillas dobles, puede ser necesario escapar algún otro
carácter especial para el shell... Los "$"?
El "*.php" del final es necesario? Como estás utilizando xargs, me
parece raro. Mirar mucho estas expresiones puede ocasionar
desprendimiento de córnea.

2. Otra posibilidad pero con Perl:

$ cat cambiar
#!/usr/bin/perl -p -i
$buscar = q#<base href="http://<\? echo \$_SERVER\['SERVER_NAME'\];
\?>/es/" />#;
$reemplazar = q#<base href="http://<?=$_SERVER['SERVER_NAME']?>/" />#;
s/$buscar/$reemplazar/g;

$ cat prueba.dat
AAA<base href="http://<? echo $_SERVER['SERVER_NAME']; ?>/es/" />AAA
BBB<base href="http://<? echo $_SERVER['SERVER_NAME']; ?>/es/" />BBB
CCC<base href="http://<? echo $_SERVER['SERVER_NAME']; ?>/es/" />CCC

$ ./cambiar prueba.dat

$ cat prueba.dat
AAA<base href="http://<?=$_SERVER['SERVER_NAME']?>/" />AAA
BBB<base href="http://<?=$_SERVER['SERVER_NAME']?>/" />BBB
CCC<base href="http://<?=$_SERVER['SERVER_NAME']?>/" />CCC


-- 
Eduardo Grosclaude
Universidad Nacional del Comahue
Neuquen, Argentina


Más información sobre la lista de distribución CentOS-es