8 Stimmen

Wie ersetzt man Text unter Beibehaltung der Großschreibung?

Angenommen, ich möchte eine Datei mit folgendem Inhalt durch eine Zeichenfolge ersetzen

name
nAmE
naMEbb
NAME

Und wollte das Wort "Name" durch "dave" ersetzen, aber die Großschreibung des Originaltextes beibehalten. Meine gewünschte Ausgabe wäre zum Beispiel,

dave
dAvE
daVEbb
DAVE

Gibt es irgendwelche Einzeiler, dies zu tun (vorzugsweise in Perl, so dass ich eine In-Place-Ersetzung über viele Dateien tun kann)?

EDIT Das Problem ist zweideutig, es sei denn, beide Zeichenketten haben genau die gleiche Länge. Nehmen wir an, das ist der Fall.

8voto

mMontu Punkte 8593

Es gibt einige Lösungen auf perlFaq: http://perldoc.perl.org/perlfaq6.html#How-do-I-substitute-case-insensitively-on-the-LHS-while-preserving-case-on-the-RHS ?

Eine der dort vorgestellten Lösungen ermöglicht es, die Ersetzung in einer einzigen Zeile durchzuführen, indem ein Unterprogramm (preserve_case) definiert wird:

   $string = "this is a TEsT case";
   $string =~ s/(test)/preserve_case($1, "success")/egi;
   print "$string\n";

Dies wird ausgedruckt: dies ist ein SUcCESS-Fall

0voto

Tomas Punkte 54613

Es ist verrückt, aber es funktioniert:

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

eine Lösung in einer Zeile!

0voto

Raimund Steger Punkte 59

Ich frage mich, ob das Beispiel aus perlfaq für Nicht-ASCII funktioniert. Eine Variante, die den XOR-Hack nicht verwendet, könnte sein:

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

Dies funktioniert jedoch nur, wenn die /i Modifikator lokal aktiviert ist (siehe perllocale).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X