2011-08-09 22 views
8

aşağıdaki içerikleri Büyük Harf Devam ederken Metni Nasıl Değiştirilir?

name 
nAmE 
naMEbb 
NAME 

ile bir dosya üzerinde yerini bir dize istedim Say Ve "dave" ile kelime "ad" yerine istedi ama orijinal metnin büyük harf tutuyor. Örneğin benim istenen çıkış olurdu
dave 
dAvE 
daVEbb 
DAVE 

bunu yapmak için herhangi bir astarları (tercihen Perl yüzden birçok dosya arasında bir yerinde ikame yapabilir) var mı?

EDIT Sorun, her iki dizenin tam olarak aynı uzunlukta olmadıkça belirsizdir. Yapacağını varsayalım.

+3

Orijinal ve bozulmamış dize aynı uzunlukta mı? Aksi takdirde "aynı dava" tanımı belirsizdir. – enzotib

cevap

0

Bu çılgınlık ama o çalışır:

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";' 

tek satırlık çözüm!

0

Perlfaq örneğinin ASCII olmayanlar için çalışıp çalışmadığını merak ediyorum. XOR kesmek kullanmaz bir varyantı olabilir:

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

Ama bu sadece çalışır /i değiştirici yerel özellikli (perllocale bakınız) ise.

İlgili konular