Ich habe einen Quellcode über mehrere Dateien verteilt.
- Es hat ein Muster,
abcdef
das ich ersetzen musspqrstuvxyz
. - Das Muster könnte sein
Abcdef
(Satz Groß- / Kleinschreibung), dann muss es ersetzt werden durchPqrstuvxyz
. - Das Muster könnte sein
AbCdEf
(Groß- / Kleinschreibung umschalten), dann muss es ersetzt werden durchPqRsTuVxYz
.
Kurz gesagt, ich muss den Fall des Quellmusters abgleichen und das entsprechende Zielmuster anwenden.
Wie kann ich dies mit sed
einem anderen Tool erreichen?
text-processing
sed
awk
user1263746
quelle
quelle
ABcDeF
?ABcDeF
->PQrStUvxyz
, dann wäre sicherlichAbCdEf
->PqRsTuvxyz
logisch konsistent. Wenn der Fall von einer Zeichenfolge in die andere kopiert werden soll, was soll passieren, wenn die zweite Ersatzzeichenfolge länger ist.Antworten:
Tragbare Lösung mit
sed
:Mit GNU sed ist es ein bisschen einfacher:
Durch die Verwendung von
&&&
oben wird das Fallmuster der Zeichenfolge für den Rest der Ersetzung wiederverwendet. EsABcdef
würde also zuPQrstuVWx
undAbCdEf
zu geändertPqRsTuVwX
. Ändern Sie es auf&
, um nur den Fall der ersten 6 Zeichen zu beeinflussen.(Beachten Sie, dass es möglicherweise nicht das tut, was Sie wollen, oder in eine Endlosschleife gerät, wenn die Ersetzung möglicherweise einer Ersetzung unterliegt (zum Beispiel, wenn Sie
foo
fürfoo
oderbcd
für ersetzenabcd
).quelle
Tragbare Lösung mit
awk
:Beispiel Eingabe:
Beispielausgabe:
Aktualisieren
Wie in den Kommentaren erwähnt, ersetzt das Obige nur die erste Instanz von
find
in jeder Zeile. So ersetzen Sie alle Instanzen:Beispiel Eingabe:
Beispielausgabe:
quelle
Du könntest es gebrauchen
perl
. Direkt aus der FAQ - zitiert ausperldoc perlfaq6
:Wie ersetze ich die Groß- / Kleinschreibung in der LHS, während die Groß- / Kleinschreibung in der RHS beibehalten wird?
Hier ist eine schöne Perlish-Lösung von Larry Rosler. Es nutzt die Eigenschaften von bitweisem xor für ASCII-Zeichenfolgen.
Und hier handelt es sich um eine Subroutine, die wie folgt aufgebaut ist:
Dies druckt:
Alternativ können Sie den folgenden Code von Jeff Pinyan verwenden, um die Groß- und Kleinschreibung des Ersatzworts beizubehalten, falls es länger als das Original ist:
Dies ändert den Satz in "Dies ist ein Erfolgsfall".
Nur um zu zeigen, dass C-Programmierer C in jeder Programmiersprache schreiben können. Wenn Sie eine C-ähnliche Lösung bevorzugen, wird im folgenden Skript für die Ersetzung der gleiche Groß- und Kleinschreibung verwendet, Buchstabe für Buchstabe wie für das Original. (Es ist auch ungefähr 240% langsamer als die Perlish-Lösung.) Wenn die Ersetzung mehr Zeichen als die zu ersetzende Zeichenfolge enthält, wird der Fall des letzten Zeichens für den Rest der Ersetzung verwendet.
quelle
Wenn Sie das Ersetzen auf
pqrstu
zuschneiden, versuchen Sie Folgendes :Eingang:
Ausgang:
Wenn Sie ersetzen möchten
prstuvxyz
, kann dies sein:Ich kann keine Regel zur Zuordnung finden
ABcDeF
->PQrStUvxyz
.quelle
So etwas würde das tun, was Sie beschrieben haben.
quelle