Perl-Kommentare entfernen mit sed

angelsfall

angelsfall

Routinier
Hallo,

eigentlich dachte ich, dass sei ein Leichtes, aber irgendwie krieg ich es grade nicht gebacken:
Ich möchte aus einem Perl-Skript die Kommentarzeilen entfernen, um dann die übrig gebliebenen Zeilen zu zählen.
Perl Kommentare werden durch ein # gekennzeichnet. Davor kann sich auch ein Space bzw. Tab befinden.

Code:
sed -ne '/^[[:blank:]]*[^#]/p' < script.pl | wc -l

Diese Zeile entfernt alle Zeilen bis auf die Kommentarzeilen die mit Tabs und Spaces beginnen. Aber warum? Meiner Meinung nach ist das richtig.
sed scheint sich aber nicht sonderlich für meine Meinung zu interessieren ;)
(Ich habe auch schon blank durch space ersetzt, das hatte keine Auswirkung.)

Korrigiert mich! :)
 
Hallo

Wenn du nur die Zeilen filtern willst, die mit Leerzeichen oder tab gefolgt von # beginnen:

Code:
sed -ne '1p;/^[[:blank:]]*#/!p' < test

Die Shebang wird hier mitgezählt (Zeile 1).

Gruß Wolfgang
 
Hi,

Code:
sed -ne '/^[[:blank:]]*[^#]/p' < script.pl | wc -l

Ein blank oder space ist auch ein nicht-hash.
Da sed gierigerweise von rechts nach links sucht, trifft der letzte dabei vorkommende nicht-hash spätestens auf das erste (von links) blank zu.
Nur wenn das erste Zeichen ein hash ist, trifft das Muster darauf nicht zu.

Wolfgang hat ja schon eine passende Alternative gezeigt.
Zur Ergänzung noch die Möglichkeit des Herauslöschens statt Herausschreibens:
Code:
sed -e '[i]1p;[/i]/^[[:blank:]]*#/d' < script.pl | wc -l

Gruß Daniel
 
Danke für eure Antworten.

Ein !p ist also praktisch ein invertiertes print, richtig?
Was genau meint hash im Zusammenhang mit sed?
 
Danke für eure Antworten.

Ein !p ist also praktisch ein invertiertes print, richtig?
Was genau meint hash im Zusammenhang mit sed?

Nein, das ! bezieht sich auf die Bedingung davor.
In diesem Fall :
printe alles was nicht auf die Regex zutrifft.

hash meint einfach das Zeichen #
Sprich auch Doppelkreuz. ;)
Und negiertes # bedeutet ja alles Zeichen außer #.
Ein Tabulator ist also auch ein nicht Doppelkreuz.

Gruß Wolfgang
 
Zurück
Oben