2010-08-28 2 views
7

Ich habe eine Datei, die eine Menge von diesenWas mache ich falsch in diesem Perl Einliner?

"/watch?v=VhsnHIUMQGM" 

enthält, und ich möchte den Buchstaben-Code für die Ausgabe eines Perl-Einzeiler verwenden. Also versuche ich

perl -nle 'm/\"\/watch\?v=(.*?)\"/g' filename.txt 

aber es druckt nichts.

Was mache ich falsch?

+1

See [ 'perldoc perlrun'] (http://perldoc.perl.org/perlrun.html) –

Antwort

13

Die Option -n verarbeitet jede Zeile, druckt aber nichts aus. Sie müssen also eine explizite print hinzufügen, wenn Sie erfolgreich übereinstimmen.

perl -ne 'while (m/\"\/watch\?v=(.+?)\"/g) { print "$1\n" }' filename.txt 

Ein anderer Ansatz, wenn Sie jede Linie übereinstimmen, sind sicher, ist die -p Option zu verwenden, die den Wert von $_ nach der Verarbeitung ausdruckt, zB:

perl -pe 's/\"\/watch\?v=(.+?)\"/$1//' filename.txt 
1

Sie die Zeichenfolge aufspalten auf "=" anstatt übereinstimmend:

perl -paF= -e '$_= @F[1]' filename.txt 
6

Ihre Regex ist in Ordnung. Sie erhalten keine Ausgabe, da die Option -n nichts drucken wird. Es umschließt einfach eine while (<>) { ... } Schleife um Ihr Programm (führen Sie perl --help für kurze Erklärungen der Perl-Optionen).

Im Folgenden wird Ihre Regex verwendet, aber etwas Drucken hinzugefügt. Im Listenkontext geben Regexes mit der Option /g alle Captures zurück. Effektiv drucken wir jede Aufnahme.

perl -nle 'print for m/\"\/watch\?v=(.*?)\"/g' data.dat 
+0

Lohnt es sich, das Hinzufügen einer' \ n ', so dass Aufnahmen getrennt sind? –

+0

@PP Die '-l' Option behandelt das. – FMc