Weisen Sie der Variablen Werte aus der Textdatei zu. Suchen Sie nach der Zeichenfolge in der Datei. Ersetzen Sie die Zeichenfolge in der Datei?

342
gadhvi

Ich arbeite an einem Projekt, bei dem ich einige tausend Datenzeilen korrigieren muss. Ich habe die halbe Arbeit bereits abgeschlossen und jetzt stehe ich beim letzten Teil fest.

Ich habe eine Datei namens tree.txt, die eine Liste aller Knoten enthält. Aufgrund eines Fehlers oder eines Fehlers haben viele Knoten jedoch einen falschen Tag-Namen. tree.txt-

Main_Overview/Ballast/BA-02:Tag=BA-02 Main_Overview/Ballast/BA-03:Tag=BA-02-1 Main_Overview/Ballast/BA-04:Tag=BA-02-2 

Wie oben gezeigt, ist der Tag-Name des Knotens BA-03 und BA-04 falsch. Daher konnte die Datei-Behandlung in CI diese Textdatei korrigieren und auch alle fehlerhaften Tags der jeweiligen Knoten in der folgenden Datei drucken. wrong_tags.txt-

"BA-02-1" "BA-03" "BA-02-2" "BA-04" 

Das letzte ist, dass es viele andere Dateien gibt, bei denen ein falscher Tag-Name verwendet wird, und ich muss all diese falschen Tags durch korrekte ersetzen.

Mein Ansatz zur Lösung des Problems ist ->

  1. Ich werde zwei Variablen Knoten und Tag, diese beiden Variablen gibt Daten von oben bekommen incorrect_tag.txt . Ich werde in jeder Datei nach dem Wert von tag suchen und ihn durch den Wert des jeweiligen Knotens ersetzen.
  2. Wenn ich mit dem Suchen und Ersetzen des ersten Tags in allen Dateien fertig bin, wird es für die verbleibenden Tags genauso sein.

Aufgrund meines begrenzten Wissens weiß ich jedoch nicht, ob es möglich ist oder nicht. Auch wenn ich Hilfe zur Syntax bekomme, könnte ich mich ausruhen. Vielen Dank

Bearbeiten-

Die anderen Dateien, in denen ich Daten suchen und ersetzen muss, sind unterschiedlich .. zB Ballast.j1

:1176:489:15:30:CompID=118680:Text=BA-02:uiFont=Arial-PLAIN-10:  :1269:489:15:30:CompID=118681:Text=BA-02-1:uiFont=Arial-PLAIN-10: :1013:489:15:30:CompID=118677:Text=BA-02-2:uiFont=Arial-PLAIN-10: 

Es gibt in der Nähe von 2000 .j1-Dateien, in denen ich jeden Tag-Namen in all diesen .j1-Dateien durchsuchen und durch den richtigen Tag-Namen oder -Knoten ersetzen werde.

0
Sie versuchen nur, jede Datei (z. B. Main_Overview / Ballast / BA-04) zu nehmen und eine Suche durchzuführen und BA-02-2 -> BA-04 in dieser Datei zu ersetzen. davidgo vor 6 Jahren 0
Sie meinen damit, dass Main_Overview / Ballast / BA-03: Tag = BA-02-1 neu geschrieben werden sollte wie: Main_Overview / Ballast / BA-03: Tag = BA-03 und andere sollten, Main_Overview / Ballast / BA- 04: Tag = BA-04? Rajesh S vor 6 Jahren 0
@davigo Ich muss nur die falschen Tag-Namen ersetzen, die in anderen Dateien vorhanden sind, die ich jetzt erwähnt habe, da ich zuerst wissen muss, welche falsch sind und wie der genaue Name lautet. Ich habe eine im zweiten Block erwähnte Textdatei erstellt, die zuerst den alten und dann den neuen Namen enthält. gadhvi vor 6 Jahren 0

1 Antwort auf die Frage

1
tripleee

Suchst du das einfach?

sed -i '\%/\([^/:]*\):Tag=\1%n;s%%/\(\([^/:]*\):Tag=\)[^/:-]*-[^/:-]*%\1\2%' *.j1 

(Versuchen Sie, ohne die -iAusgabe zu sehen, ohne sie in die ursprüngliche Datei - Pipe zurückzuschreiben, lessdamit 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 sedSkript umwandeln . Wenn Sie eine Datei incorrect_tags.txtwie

"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 sedSkript, 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 -ivorher zu sehen, wie die Ausgabe aussieht. sedMöglicherweise gefällt Ihnen die -fOption nicht oder das Lesen eines Skripts für die Standardeingabe wird möglicherweise nicht unterstützt. Speichern Sie dann einfach die Ausgabe vom ersten sedAufruf 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.

Danke, aber ich habe diesen Teil bereits mit C gemacht. Der letzte verbleibende Teil ist, ich muss die alten falschen Markennamen durch neue ersetzen, aber diese Dateien sind unterschiedlich. Ich habe es jetzt erwähnt und es gibt fast 2K-Dateien. gadhvi vor 6 Jahren 0
Update jetzt ansehen. Die Verwendung von C für diese Art von Dingen ist wahrscheinlich fehlgeleitet, aber wenn Sie dies bereits getan haben, können Sie auch die Ergebnisse verwenden. tripleee vor 6 Jahren 0
Ich habe nie gedacht, dass Sed so mächtig ist, dass ich mehr davon lernen muss. gadhvi vor 6 Jahren 0