2016-06-30 5 views
-1

Ich versuche, einen Weg zu finden, Perl zu verwenden, um Linien zu entfernen, die enthalten:entfernen Zeilen Perl mit mehreren Suchmuster

errors: 
mirror 
raid* 
pond 

Ich habe finden verwaltet:

perl -pi -e "s,errors:,," 

Gibt es eine Möglichkeit, alle Muster, nach denen ich suche, in einem Befehl anzugeben?

+4

Einfach in grep, 'grep -Ev "Fehler: | Spiegel | Razzia * | Teich" file' – Inian

+0

Es ist Solaris leider' -E' Option existiert nicht, aber du hast recht, warum über komplizieren . 'egrep' wirkte wie ein Zauber. – hplodur

+0

^^ versuche mit 'grep -v -e pattern1 -e pattern2' dann ... – anishsane

Antwort

5

Da Sie Perl erwähnen Sie verwenden können:

perl -ne 'print unless /errors:|mirror|raid\*|pond/' 

Alternative können Sie mit sed oder grep:

sed '/errors:\|mirror\|raid\*\|pond/d' 

Oder grep mit re -v erse:

grep -v 'errors:\|mirror\|raid\*\|pond' 

können Sie fügen die -i Nplace Flag sowohl sed und Perl

0

Dies ist ein Weg:

open my $fh, "<", "file.txt" or die $!; 

while(my $line = <$fh>) 
{ 
    if ($line =~ m/errors:|mirror|raid\*|pond/) 
    { 
     next; 
    } 
    print $line; 
} 
close $fh; 
1

Mit egrep als Solaris nicht die -E, --extended-regexp Option unterstützt hat

egrep -Ev "errors:|mirror|raid*|pond" file 

Ein anderer Weg, mit awk

awk '!/errors:|mirror|raid*|pond/' file 

Dank zu anishsane Vorschlag in den Kommentaren mit grep mit mehrere Ausdrücke,

grep -v -e "errors:" -e "mirror" -e "raid*" -e "pond" file 
+1

Das Perl-Snippet wird Zeilen drucken, die nicht mit' errors: 'beginnen, ... OP fragt nach contains. Beachten Sie auch, dass '*' ein Meta-Zeichen ist und dass es maskiert werden muss, um es wörtlich zu behandeln. – andlrc

+0

@andlrc: Die 'Perl'-Lösung wurde entfernt. Versuchte Wege, es zu beheben, was könnte der optimale Weg mit meiner Logik sein? – Inian

Verwandte Themen