Suchst du das einfach?
sed -i '\%/\([^/:]*\):Tag=\1%n;s%%/\(\([^/:]*\):Tag=\)[^/:-]*-[^/:-]*%\1\2%' *.j1
(Versuchen Sie, ohne die -i
Ausgabe zu sehen, ohne sie in die ursprüngliche Datei - Pipe zurückzuschreiben, less
damit Sie anhalten und vor und zurück scrollen können.)
Die Klammern im ersten Ausdruck suchen nach einer Zeichenfolge zwischen einem Schrägstrich und einem Doppelpunkt. Wenn wir dies unmittelbar gefolgt von Tag=
und der gleichen Zeichenfolge wie der finden, die zwischen den Klammern passt, sind wir gut. Die gekreuzten Klammern erfassen diese Zeichenfolge, sodass wir als zurückverweisen können \1
.
Wenn wir dieses Muster nicht gefunden haben, Tag=
muss sich die Zeichenfolge danach von der erfassten Zeichenfolge unterscheiden. Wenn dies der Fall ist, ersetzen Sie die Zeichenfolge Tag=
durch die erfasste Zeichenfolge. Der reguläre Ausdruck ersetzt eine Sequenz, die einen einzelnen Bindestrich und ansonsten keine Bindestriche, Doppelpunkte oder Schrägstriche enthält (also bis kurz vor dem zweiten Bindestrich oder dem ersten Slash oder Doppelpunkt).
Wenn Sie sich auf * BSD (einschließlich Mac OS) befinden, brauchen Sie -i ''
nicht nur -i
.
Für einen anderen Ansatz können Sie Ihre Zuordnungen in ein sed
Skript umwandeln . Wenn Sie eine Datei incorrect_tags.txt
wie
"BA-02-1" "BA-03" "BA-02-2" "BA-04"
Dann können Sie das folgende Skript ausführen
sed 's%^"%s/%;s%" "%/%;s%"$%/g%' incorrect_tags.txt
was produziert ... ein anderes sed
Skript, das jetzt aussieht
s/BA-02-1/BA-03/g s/BA-02-2/BA-04/g
die Sie an eine andere Instanz übergeben können sed
, um die Dateien zu ändern, die diese Token enthalten, die Sie ersetzen möchten.
Die volle Pipeline ist dann
sed 's%^"%s/%;s%" "%/%;s%"$%/g%' incorrect_tags.txt | sed -i -f - *.j1
Wieder möchten Sie vielleicht versuchen, ohne -i
vorher zu sehen, wie die Ausgabe aussieht. sed
Möglicherweise gefällt Ihnen die -f
Option nicht oder das Lesen eines Skripts für die Standardeingabe wird möglicherweise nicht unterstützt. Speichern Sie dann einfach die Ausgabe vom ersten sed
Aufruf in eine temporäre Datei und geben Sie dann den temporären Dateinamen als Dateinamenargument an -f
.
Beachten Sie, dass die Tags sich nicht überlappen müssen. Wenn Sie zuerst A durch B und dann B durch C ersetzen, ist das Endergebnis so, als hätten Sie "A" "C" angegeben. Eine Problemumgehung besteht darin, die Reihenfolge so zu ändern, dass B zuerst durch C und erst dann A mit B ersetzt wird.