Para entender cómo hacerlo, debe comprender cómo el shell está jugando con sus cotizaciones y barras diagonales inversas, así como si sed
está jugando con ellas.
En general, es más fácil utilizar comillas simples en el intérprete de órdenes, excepto cuando la expresión regular debe coincidir con comillas simples. No hay caracteres especiales dentro de comillas simples; la próxima cita simple lo finaliza. Las comillas dobles son mucho más difíciles; las barras invertidas, los dólares y las comillas son especiales.
El primer requisito es mejor manejado por un solo citado sed
expresión:
Cambio:
[server]
server[] = "localhost:11211"
a
[server]
server[] = "localhost:11211"
server[] = "localhost:11212"
Para esto, podríamos utilizar:
-e '/^server\[] = "localhost:11211"/{p;s/11211/11212/}'
El shell simplemente envía todo dentro de las comillas simples al sed
, intacto. El único carácter especial para sed
es el corchete cuadrado abierto. Eso comenzaría una clase de caracteres a excepción de la barra invertida anterior. El corchete de cierre solo es especial cuando estás en una clase de personaje, por lo que no es necesario escapar. Las acciones para reconocer esa línea son imprimir el original, luego hacer el 11212 para la sustitución del 11211; la impresión predeterminada imprimirá la línea modificada.
La otra parte es un poco más complicada. Debido a que los patrones contienen comillas simples, lo mejor será usar comillas dobles alrededor de la expresión regular.
Cambio:
define('ADMIN_USERNAME','username'); // Admin Username
define('ADMIN_PASSWORD','password'); // Admin Password
$MEMCACHE_SERVERS[] = 'mymemcache-server1:11211'; // add more as an array
$MEMCACHE_SERVERS[] = 'mymemcache-server2:11211'; // add more as an array
a:
define('ADMIN_USERNAME','myusername'); // Admin Username
define('ADMIN_PASSWORD','mypassword'); // Admin Password
$MEMCACHE_SERVERS[] = 'localhost:11211'; // add more as an array
$MEMCACHE_SERVERS[] = 'localhost:11212'; // add more as an array
Las dos primeras líneas podrían ser mapeable utilizando una sola expresión regular:
-e "s/^\(define('ADMIN_[A-Z]\{0,8\}','\)\([^']*'\)/\1my\2/"
Esto captura dos partes - el define('ADMIN_USERNAME','
como \1
y username'
como \2
, y la sustitución coloca my
entre las dos partes. Esto no fue tan malo; el intérprete de comandos no hace nada especial con ninguno de los personajes, por lo que simplemente escriba lo que desea sed
para ver dentro de las comillas dobles.
Las dos últimas líneas son más difíciles:
-e "s/^\(\$MEMCACHE_SERVERS\[] = '\)[^:]*\(:[0-9]*'\)/\1localhost\2/"
Sin embargo, no es mucho más complicado; solo tiene que detener el shell para expandir el $MEMCACHE_SERVERS
como una variable de shell, por lo que hay una barra invertida delante del $
. El corchete necesita protección de sed
como antes. La expresión regular coincide con todo lo que no es dos puntos y lo reemplaza con localhost
.
Por lo tanto, este script debería funcionar:
sed -e '/^server\[] = "localhost:11211"/{p;s/11211/11212/}' \
-e "s/^\(define('ADMIN_[A-Z]\{0,8\}','\)\([^']*'\)/\1my\2/" \
-e "s/^\(\$MEMCACHE_SERVERS\[] = '\)[^:]*\(:[0-9]*'\)/\1localhost\2/" \
"[email protected]"
Sin embargo, sólo he explicado por qué se debe trabajar; ¡No he demostrado que funcione!
La mejor respuesta en mi opinión. – wind39