
Ich suche nach einer einfachen Möglichkeit, Regex in einem UNIX-Shell-Skript zu verwenden, da nicht jedes System über in grep integrierte Perl-Erweiterungen verfügt. Was an Perl Regex hier wirklich hilfreich ist, sind Rückwärts-/Vorwärtsreferenzen, für die ich noch keine Möglichkeit gefunden habe, sie in sed effektiv zu verwenden. Ich habe mir schnell den folgenden 1-Zeilen-Code ausgedacht:
tail --bytes=+K something.log| perl -e 'while (my $line = <STDIN>){if ($line =~ /$ARGV[0]/){print $line};}' 'my regex'
F1. Ist dies eine sichere Vorgehensweise für Perl? F2. Sollte ich stattdessen einfach das gesamte Skript in Perl schreiben?
Antwort1
Ich verstehe nicht, warum Ihr Perl-Snippet so geschrieben ist. Sie könnten den regulären Ausdruck direkt in das Skript schreiben:
perl -e 'while (my $line = <STDIN>) {if ($line =~ /my regex/) {print $line}}'
Dadurch können Sie die Option nutzen -n
(als Bonus erhalten Sie eine ordnungsgemäße Fehlerberichterstattung, falls ein Eingabefehler auftritt). Weitere Verwendung von Perl-Ausdrücken:
perl -ne 'print if /my regex/'
Sed verfügt über Rückverweise, aber die erweiterten regulären Ausdrücke von Perl sind leistungsfähiger. Es gibt Dinge, die Sie mit Sed nicht tun können (Sed verfügt nicht einmal über vollständige reguläre Ausdrücke: Alternation \|
ist keine Standardfunktion, obwohl viele Implementierungen sie haben).
Die meisten Dinge, die Sie mit herkömmlichen Tools tun können, können Sie problemlos in Perl tun. Wenn Sie beispielsweise die ersten K-1 Bytes überspringen möchten, können Sie schreiben
perl -ne 'BEGIN {read ARGV, "", 42-1}; …'
Wenn Sie Portabilität wünschen, können viele Textverarbeitungsaufgaben in awk durchgeführt werden, aber awk hat überhaupt keine Rückreferenzen, sodass das Extrahieren von Text aus einer Zeichenfolge umständlich sein kann.