Wie entferne ich Text vor dem Trennzeichen?

Wie entferne ich Text vor dem Trennzeichen?

Ich brauche Hilfe beim Entfernen von Text nach );und vor |Trennzeichen in allen Zeilen einer Textdatei. Beispiel:

 SUBSCIBER_MSISDN=6289666195060');BEGIN DBMS_LOCK.SLEEP(5); END-- rKSy|

Und das Ergebnis sollte so aussehen

SUBSCIBER_MSISDN=6289666195060|

Irgendeine Idee, wie man diesen Teil entfernt? Es ist eine große Datei.

Ich werde verrückt, wenn ich es verwenden muss sed.

Antwort1

Angenommen, Sie zeigen eine vollständige Zeile aus einer Eingabedatei:

sed "s/'.*/|/" file >newfile

Dies würde alles nach dem ersten 'Zeichen in jeder Zeile durch ein |Zeichen ersetzen. Das Ergebnis würde mittels Umleitung in eine neue Datei geschrieben. Ich verwende doppelte Anführungszeichen um den sedAusdruck, da eine Zeichenfolge in einfachen Anführungszeichen niemals ein einfaches Anführungszeichen enthalten kann.

Angesichts Ihrer Beispieldaten würde dies ergeben

 SUBSCIBER_MSISDN=6289666195060|

Wenn Sie zusätzlich Leerzeichen am Zeilenanfang entfernen möchten (Ihr Beispiel scheint dies zu tun):

sed -e "s/'.*/|/" -e 's/^[[:blank:]]*//' file >newfile

oder,

sed "s/'.*/|/; s/^[[:blank:]]*//" file >newfile

Wenn Sie eine Abneigung gegen haben sed, können Sie verwenden, awkum genau dieselbe Transformation durchzuführen:

awk '{ sub("'"'"'.*", "|"); sub("^[[:blank:]]*", ""); print }' file >newfile

Das Ausgefallene '"'"'ist ein einfaches Anführungszeichen. Es muss außerhalb der einfachen Anführungszeichen, die den awkCode bilden, doppelt in Anführungszeichen gesetzt werden. Wir könnten auch verwenden '\'', ie

awk '{ sub("'\''.*", "|"); sub("^[[:blank:]]*", ""); print }' file >newfile

Alternativ können Sie für das einfache Anführungszeichen den oktalen ASCII-Code verwenden:

awk '{ sub("\047.*", "|"); sub("^[[:blank:]]*", ""); print }' file >newfile

verwandte Informationen