2010-12-14 37 views
4

J'ai un script (source) pour analyser svn info pour créer une chaîne appropriée pour Bash $PS1. Malheureusement, cela ne fonctionne pas sur un système que j'utilise qui exécute Perl 5.8.8 - Il produit toutes les lignes au lieu de seulement les correspondances. Quel serait le Perl 5.8.8 équivalent à ce qui suit?Renvoie uniquement les correspondances de substitution en Perl 5.8.8 (était: Perl "p" équivalent modificateur regex)

__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 
} 

La sortie de Perl 5.10 contient uniquement un espace, entre parenthèses, une de nom de la branche, le nom d'étiquette ou trunk, et la parenthèse d'extrémité. La sortie de Perl 5.8.8 (sans le p final) contient cette plus une version entre parenthèses de chaque partie de la sortie svn info séparée par des espaces.

Une solution de contournement possible implique un simple grep '^URL: ' entre les commandes svn et perl, mais j'espérais éviter cela car cela sera exécuté pour chaque invite Bash.

+0

Pouvez-vous expliquer ce que vous essayez de faire - donner un fichier d'entrée et quelle sortie attendez-vous. – justintime

+0

Peut-être que je ressemble à un enregistrement coincé, mais "Pouvez-vous expliquer ce que vous essayez de faire - donner un fichier d'entrée et quelle sortie vous attendez". Vous présentez beaucoup de solutions à moitié cuites mais je ne peux pas déterminer ce que vous voulez. – justintime

Répondre

11

Si vous ne voulez que la sortie d'une ligne correspondant, n'utilisez pas le commutateur de ligne de commande -p. Il imprime la valeur de $_ à la fin de chaque boucle. Vous voudrez peut-être quelque chose avec le commutateur de ligne de commande -n:

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

que je le ferais de la même manière pour Perl v5.8 et v5.10. Je ne suis pas sûr de ce que vous pensez que le modificateur /p fait puisque vous n'utilisez pas les variables $`, $&, ou $' ou leurs équivalents par match.

Vous pouvez lire à propos des commutateurs de ligne de commande dans perlrun.

+0

Merci, c'était juste la chose! J'avais mal compris '/ p' et ce qu'il a fait. Encore bizarre que Perl 5.10 n'imprime pas toutes les lignes, cependant. – l0b0

6

Au perl 5.10, le commutateur /p indique à Perl de mettre un contenu adapté en ${^PREMATCH}, ${^MATCH} et ${^POSTMATCH}.

Et la doublure que vous avez publiée n'utilise jamais ces variables, alors omettez le /p.

MISE À JOUR: Essayer de suivre la question initiale ...

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

Est-ce que des lignes d'impression dont le remplacement a été fait. Notez -n par rapport au commutateur -p. En outre, j'ai essayé le combo -p/p sur mon 5.10 et il imprime heureusement des lignes non-assorties inchangées aussi. Peut-être ai-je manqué quelque chose ...

+0

Clarification de la question - Le problème est plus sur ce qui est retourné par Perl. – l0b0