2011-08-09 8 views
8

dicho que quiera sustituir a una cadena en un archivo con el siguiente contenidoCómo reemplazar texto mientras se mantienen las mayúsculas?

name 
nAmE 
naMEbb 
NAME 

y quiso reemplazar el "nombre" con la palabra "Dave", pero manteniendo la capitalización del texto original. Por ejemplo, mi salida deseada sería,

dave 
dAvE 
daVEbb 
DAVE 

¿Hay una sola línea de hacer esto (preferiblemente en Perl para poder hacer una sustitución en el lugar a través de muchos archivos)?

EDIT El problema es ambiguo a menos que ambas cadenas tengan exactamente la misma longitud. Supongamos que sí.

+3

¿La secuencia original y sustituida tiene la misma longitud? De lo contrario, la definición de "mismo caso" es ambigua – enzotib

Respuesta

0

Es una locura pero obras:

perl -e 'use List::MoreUtils "pairwise"; $_ = "toto naME nAmE"; s/(name)/@x = map(ord, split "", "DAVE"); @y = map(ord>=97?32:0, split "", $1); @c = map chr, pairwise { $a + $b } @x, @y; $" = ""; "@c";/gei; print "$_\n";' 

una solución de línea!

0

Me pregunto si el ejemplo de perlfaq funciona para no-ASCII. Una variante que no utiliza el hack XOR podría ser:

$text =~ s{$str_to_replace}{my $i=0;join "",map {substr($&,$i++,1)=~/\p{IsLower}/?lc:uc} split //,$str_to_substitute}ieg; 

Pero esto sólo funciona si el modificador /i es permitido la configuración regional (ver perllocale).

Cuestiones relacionadas