![Wie entferne ich Text vor dem Trennzeichen?](https://rvso.com/image/168776/Wie%20entferne%20ich%20Text%20vor%20dem%20Trennzeichen%3F.png)
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 sed
Ausdruck, 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, awk
um 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 awk
Code 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