2010-12-14 4 views
4

Ich habe ein Skript (source) zu analysieren svn info, um eine geeignete Zeichenfolge für Bash $PS1 zu erstellen. Leider funktioniert das nicht auf einem System, das ich benutze, das Perl 5.8.8 ausführt - Es gibt alle Zeilen statt nur die Übereinstimmungen aus. Was wäre das Perl 5.8.8, das dem Folgenden entspricht?Zurück nur Übereinstimmungen von Substitution in Perl 5.8.8 (war: Perl "p" Regex Modifikator entspricht)

__svn_ps1() 
{ 
    local result=$(
     svn info 2>/dev/null | \ 
     perl -pe 's;^URL: .*?/((trunk)|(branches|tags)/([^/]*)).*;\2\4 ;p') 
    if [ -n "$result" ] 
    then 
     printf "${1:- (%s)}" $result 
    fi 
} 

Die Ausgabe von Perl 5.10 enthält nur eine Raum, Klammer, einen Zweignamen, Tag-Namen oder trunk und das Ende Klammer. Die Ausgabe von Perl 5.8.8 (ohne die letzte) enthält diese plus eine geklammerte Version jedes durch Leerzeichen getrennten Teils der svn info Ausgabe.

Eine mögliche Problemumgehung beinhaltet eine einfache grep '^URL: ' zwischen den svn und perl Befehle, aber ich hatte gehofft, dies zu vermeiden, da dies für jede Bash Prompt ausgeführt wird.

+0

Können Sie erklären, was Sie zu tun versuchen - geben Sie eine Eingabedatei und welche Ausgabe Sie erwarten. – justintime

+0

Vielleicht höre ich mich wie eine festgefahrene Platte an, aber "Kannst du erklären, was du zu tun versuchst - gib eine Eingabedatei und welche Ausgabe erwartest du". Sie präsentieren viele halbgebackene Lösungen, aber ich kann nicht herausfinden, was Sie wollen. – justintime

Antwort

11

Wenn Sie nur von einer übereinstimmenden Zeile ausgeben möchten, verwenden Sie nicht den Befehlszeilenschalter -p. Am Ende jeder Schleife wird der Wert $_ ausgegeben. Sie könnten etwas mit der -n Befehlszeilenoption wollen:

perl -ne 'print if s/.../.../' 

ich es auf die gleiche Art und Weise für Perl v5.8 tun würde und v5.10. Ich bin mir nicht sicher, was Ihrer Meinung nach der Modifikator /p tut, da Sie weder die Variablen , noch $' oder deren Übereinstimmungen pro Spiel verwenden.

Sie können über die Befehlszeilenschalter in perlrun lesen.

+0

Danke, das war genau das Richtige! Ich hatte '/ p' missverstanden und was es getan hat. Immer noch seltsam, dass Perl 5.10 nicht alle Zeilen druckt. – l0b0

6

Ab Perl 5.10, die /p Schalter teilen Perl angepasst Inhalte in ${^PREMATCH}, ${^MATCH} und ${^POSTMATCH} zu setzen.

Und der One-Liner, den Sie gepostet haben, verwendet diese Vars nie, also lassen Sie die /p weg.

UPDATE: Der Versuch, mit der Ausgangsfrage zu halten ...

perl -ne 's/search/replace/ and print' 

Wird nur Druckzeilen, für die die Ersetzung vorgenommen. Hinweis -n versus -p Schalter. Außerdem habe ich die -p/p Combo auf meiner 5.10 versucht und es druckt auch unverändert nicht übereinstimmende Zeilen. Vielleicht habe ich etwas verpasst ...

+0

Die Frage wurde geklärt - Das Problem besteht eher darin, was von Perl zurückgegeben wurde. – l0b0