2011-08-09 34 views
8

說我想一個字符串,其內容如下如何在保持大寫的同時替換文本?

name 
nAmE 
naMEbb 
NAME 

上的文件替換,想要取代「名」與「戴維」,但保持了原文的大小寫。例如,我的期望的輸出會是這樣,

dave 
dAvE 
daVEbb 
DAVE 

是否有單行做到這一點(最好是在Perl,所以我可以做在很多文件就地置換)?

編輯 問題是不明確的,除非兩個字符串具有完全相同的長度。我們假設它的確如此。

+3

原始字符串和長字符串的長度是否相同?否則,「同一案件」的定義是模棱兩可的 – enzotib

回答

0

這很瘋狂,但它作品:

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

單線解決方案!

0

我想知道perlfaq的例子是否適用於非ASCII。 不使用XOR黑客的變體可能是:

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

但是這隻能如果/i修改啓用了語言環境(見perllocale手冊)。

相關問題