2012-04-09 6 views
3

löschen Ich brauche:
Ich muss die gesamte Zeile löschen, aber die übereinstimmenden Zeichenfolgen beibehalten müssen.muss die gesamte Zeile mit Ausnahme der übereinstimmenden Zeichenfolgen

passenden Muster, beginnend mit Unhandled und endend mit einem :

hatte ich versucht, den Code unten, die das Übereinstimmungsmuster druckt, aber ich brauche die zusätzliche Zeilen aus der Datei zu löschen.

perl -0777 -ne 'print "Unhandled error at$1\n" while /Unhandled\ error\ at(.*?):/gs' filename 

Unten ist die Probeneingabe:

2012-04-09 01: 52: 13.717 - uhrerror - ERROR - 22866 - /home/shabbir/web/middleware.py process_exception - 217 - Unbehandelter Fehler bei/user/resetpassword /:: {'mod_wsgi.listener_port': '8080', 'HTTP_COOKIE': "__utma = 1.627673239.1309689718.1333823126.1333916263.156; __utmz = 1.1333636950.152.101.utmgclid = CMmkz934na8CFY4c6wod_R8JbA | utmccn = (nicht% 20set) | utmcmd = (nicht% 20set) | utmctr = nicht-kleben% 20kadai% 20online; subpopdd = ja; _msuuid_1690zlm11992 = FCC09820-3004-413A-97A3-1088EE128CE9; _we_wk_ls _ =% 7Btime% 3A'1322900804422 '% 7D; _msuuid_lf2uu38ua0 = 08D1CEFE-3C19-4B9E-8096-240B92BA0ADD; neve rmissadeal = Wahr; sessionid = c1e850e2e7db09e98a02415fc1ef490; __utmc = 1; __utmb = 1.7.10.1333916263; ‚Wsgi.file_wrapper‘:, ‚HTTP_ACCEPT_ENCODING‘: ‚gzip, deflate‘}

Antwort

0
perl -0777 -i -pe 's/.*?(Unhandled error .*?):.*/$1/g' filename 

Dieser Fehler Block mit angepassten Zeichenfolge in der Datei ersetzen wird.

-0777: wird Perl zwingen, die ganze Datei in einem Schuss zu lesen.
-i: bedeutet direkte Bearbeitung von Dateien.
-p: bedeutet Schleife Zeile-für-Linie, die durch Inhalte der Datei, Code in Hochkommata d.h. 's/.*?(Unhandled error .*?):.*/$1/g', auszuführen und das Ergebnis (matched string) gedruckt werden, die zurückgeschrieben wird mit -i Option Datei.
-e: für Befehlszeilen

+0

Das "löscht nicht die zusätzlichen Zeilen aus der Datei". Es löscht nur von übereinstimmenden Zeilen. – ikegami

+0

@Devendra: Das hat den Trick für mich .. vielen Dank :) btw .. Ich habe es auch mit einem Python-Code ... –

+0

@ ShabbirAhmed-Welcome :) –

0

Wenn ein Spiel alles, was Sie von dem ganzen String halten möchten, können Sie den String-Wert mit dem Spiel danach ersetzen. (d. h. Einfach den neuen Wert zuweisen)

Wenn Sie mehrere Übereinstimmungen innerhalb der Zeichenfolge haben, ist es möglicherweise die am wenigsten komplizierte Methode, die Übereinstimmungen vorübergehend in einem Array zu speichern. Dann verwerfen Sie einfach die ursprüngliche Variable, wenn Sie sie nicht mehr benötigen.

+0

Ich habe nur ein Spiel, aber es sollte nur um den Block zu löschen, wenn das Muster gefunden wird und das passende Muster halten. Kannst du mir bitte den Befehl erklären? –

1

Der von Ihnen angegebene Code bietet bereits das gewünschte Verhalten.

Das heißt, es gibt eine riesige redundante Zeichenfolge in Ihrem Programm, die Sie beseitigen können.

perl -0777nE'say $1 while /(Unhandled error at .*?):/gs' filename 

Schließlich scheint schlürfen die gesamte Datei völlig überflüssig.

perl -nE'say $1 if /(Unhandled error at .*?):/g' filename 
+0

Danke für die Antwort. Aber es sollte nach dem obigen Muster im Block suchen, wenn finden, löschen Sie den gesamten Block behalten Sie das übereinstimmende Muster und bewegen Sie sich zum nächsten Block. P.S: Ich bin nicht so gut mit Perl –

+0

@Shabbir Ahmed, Wie definieren Sie einen Block. Sie haben zuvor gesagt, dass Sie alle nicht bearbeitbaren Texte löschen möchten, einschließlich derjenigen aus anderen Zeilen. Jetzt willst du über einige Blöcke reden ??? – ikegami

0

I -l Option würde Zeilenenden behandeln (weniger versionsabhängig, druckt eine neue Zeile für jedes Spiel) und eine for Schleife alle Spiele zu drucken, nicht nur die erste $1. Keine Notwendigkeit, die Datei mit -0777 schlürfen.

perl -nwle 'print for /Unhandled error at .*?:/g' 

Beachten Sie, dass mit dem /g Modifikator, ein Capturing Klammer ist nicht erforderlich.

Wenn nur ein (erstes) Spiel gedruckt werden soll, /g ist überflüssig und man kann nur $1 verwenden:

perl -nlwe 'print $1 if /(Unhandled error at .*?):/' 
Verwandte Themen