Ich bin überrascht, dass niemand das s2p Dienstprogramm erwähnt, das sed "Skripte" übersetzt (Sie wissen, die meisten von die Zeit oneliner) zu gültigen Perl. (Und es gibt ein a2p Dienstprogramm für awk auch ...)
Vorschlag: Verwenden Sie reguläre Ausdrücke und Ersetzungen von Perl anstelle von grep oder sed.
Es ist ungefähr die gleiche Syntax, aber mächtiger. Auch am Ende wird es effizienter sein, als den zusätzlichen sed-Prozess aufzurufen.
Alles, was Sie mit grep oder sed tun müssen, kann einfacher in Perl erledigt werden. Zum Beispiel (das ist in etwa richtig, aber wahrscheinlich falsch):
%Vor%Angeblich hat Larry Wall Perl geschrieben, weil er etwas gefunden hat, was mit sed und awk nicht möglich war. Die anderen Antworten haben dieses Recht, verwenden Sie stattdessen Perl reguläre Ausdrücke. Ihr Code wird weniger externe Abhängigkeiten haben, für mehr Personen verständlich sein (Perls Benutzerbasis ist viel größer als die sed-Benutzerbasis), und Ihr Code wird ohne zusätzliche Arbeit plattformübergreifend sein.
Edit: Paul Tomblin erzählt eine ausgezeichnete Geschichte in seinem Kommentar zu meiner Antwort. Ich lege es hier, um seine Prominenz zu erhöhen.
Henry Spencer, der einige erstaunliche Dinge mit Awk gemacht hat, behauptete, dass Larry, nachdem er Larry Wall etwas Unartiges getan hatte, sagte, er hätte sich nicht mit Perl beschäftigt, wenn er es gewusst hätte. - Paul TomblinBenutze Macht Luke:
%Vor% Wenn Sie das gleiche denken wollen wie diese langsame und überkomplizierte grep
und sed
Kombination, können Sie es in Perl selbst viel einfacher und schneller machen:
Oder mit denselben Gedächtnisschuldigen wie die ursprüngliche Lösung
%Vor% Wenn Sie einen großen sed
-Ausdruck hätten, könnten Sie s2p
verwenden, um ihn in ein perl
-Programm umzuwandeln.
Wenn Sie & lt; s2p 's/^\([0-9]*\)[:].*//p'
& gt; ausführen, erhalten Sie Folgendes:
Bei kleinen Ausdrücken nicht unbedingt wert.
Es ist einfacher, Perl zu verwenden als grep und sed; Siehe eine andere Antwort .
Ihr Code ist fehlgeschlagen, weil Perl die umgekehrten Schrägstriche in Ihrem sed-Code verwechselt hat. Um dies zu verhindern, schreiben Sie Ihren sed-Code in 'a single-quoted Perl string'
und verwenden Sie dann \Q$sedCode\E
, um den Code in den Shell-Befehl zu interpolieren. (Über \Q...E
, siehe perldoc -f quotemeta . Sein üblicher Zweck ist es, Zeichen für reguläre Ausdrücke zu verwenden, aber funktioniert auch mit Shell-Befehlen .)
Gegeben example.txt
mit
Die Ausgabe ist 1, 3
.