2011-01-01 14 views
-2

ich eine Liste von Elementen in einer Datei haben,Suchen und Löschen von Zeilen weniger als X Zeichen lang

foobar 
barfoo 
bar 
faaboo 
foo 
boofar 
fo 
b 

Perl, ich bin gerade nach Skript, das durch den Dateinamen gehen und alle Gegenstände 3 Zeichen löschen oder weniger. Überschreibe den vorhandenen Dateinamen (ohne einen neuen oder temporären Dateinamen zu erstellen), damit wird die Liste werden.

foobar 
barfoo 
faaboo 
boofar 
+5

Was haben Sie versucht? Gibt es einen bestimmten Punkt, der ein Problem verursacht, oder möchten Sie nur, dass Ihnen jemand ein fertiges Skript gibt? –

+0

Ich nehme an, dass die Verwendung von Perl zum Aufruf des Systems "ed" nicht zählt. ☺ – tchrist

+0

@tchrist - 'ed' ist für wusses. Sie rufen Emacs an und sagen Emacs, dies zu tun (ich hoffe, dass Emacs solche nicht interaktiven Fähigkeiten hat) – DVK

Antwort

8

One-Liner:

perl -ine '{print if /.{4}/}' filename 

Sie können length verwenden (1 hinzufügen, für Newline-Zeichen) statt regex wenn das Ihre Phantasie ist, wie Jonathan Leffler in den Kommentaren darauf hingewiesen - es ist wahrscheinlich schneller auf sehr große Dateien. Hier ist eine Windows-Version (beachten Sie die Verwendung von doppelten Anführungszeichen erforderlich durch cmd statt einfache Anführungszeichen):

perl.exe -i.bak -n -e "{print if length > 4}" filename 

Auch Ihr Kommentar zu beantworten, leider Sie kann nicht ohne eine Sicherung in-place -i Änderungen unter Windows ausführen Datei. Eine detaillierte Erklärung finden Sie unter to this SO post (wiederum Windows-Beschränkung, nicht Perls) sowie eine Problemumgehung.

+1

C: \ Benutzer \ Benutzer> perl -ine '{/.{4}/}' list.txt Perl Skript kann nicht geöffnet werden '' {/.{4}/} '": Keine solche Datei oder Verzeichnis – user349418

+1

Wenn es Windows ist, MÜSSEN Sie doppelte Anführungszeichen anstelle von einzelnen verwenden (' cmd' Shell-Problem, nichts mit Perl zu tun) : 'perl -i.bak -n -e" {print if /.{4}/} "x.txt' - Bitte beachten Sie, dass diese Version eigentlich nur auf meinem ActiveState Perl erfolgreich ausgeführt wurde :) – DVK

+2

@user Sie sollten es kennen genug mit Ihrem Betriebssystem zu erkennen, dass während Standard-Unix-Shells in diesem Kontext mit einfachen Anführungszeichen perfekt glücklich sind, mit 'cmd.exe', müssen Sie doppelte Anführungszeichen verwenden, wie in:' perl -i.bak -ne '{print if /.{4}/} "filename' –

4

Tie::File

use warnings; 
use strict; 
use Tie::File; 

my $file = shift; 
tie my @array, 'Tie::File', $file or die; 
@array = grep { length > 3 } @array; 
untie @array; 
+0

Es ist bemerkenswert, dass "Krawatte" in der Regel teuer ist. –

+0

Ich versuchte das Skript, scheint gut zu funktionieren, dauerte nur viel länger (die TXT-Datei ist etwa 230k Größe) – user349418

+1

+1 für die eigentliche In-Place-Bearbeitung, aber wie der Benutzer sagte, bitte beachten Sie, dass Krawatte SLOOOOW ist. – DVK

Verwandte Themen