2010-03-02 5 views
2

J'utilise perl sur windows et j'essaie de faire un seul doublure en utilisant perl pour substituer un espace réservé dans un fichier en utilisant une variable Windows qui contient un signe dollar. Est-ce que quelqu'un sait ce que l'utilisation correcte est de le faire fonctionner avec le signe dollar. J'ai essayé plusieurs façons et je n'arrive pas à le faire fonctionner.Perl substitution en utilisant une chaîne qui contient un signe dollar sur Windows

Par exemple, je dispose d'un fichier de propriétés qui a un jeton dans ce que je suis en train de remplacer comme (MYPASSWORD!):

somevalue="!MYPASSWORD!" 

J'ai un fichier batch qui recherche dire une variable appelé NEWPASSWORD qui contient le mot de passe $ abc12345 $ et je veux utiliser la substitution perl pour remplacer la valeur comme suit. Notez que je ne sais pas toujours où les signes $ sont donc je ne peux pas leur échapper. Par exemple un autre mot de passe peut être abc 124 $ 563 $:

echo %NEWPASSWORD% <-- this would contain $abc12345$ 
perl -p -i.bak -e "s/!MYPASSWORD!/%NEWPASSWORD%/g" a.properties 

Lorsque le fait que je veux a.properties être:

somevalue="$abc12345$" 

Merci à l'avance

+1

Je ne vois pas quelle est votre vraie question ici? Pouvez-vous donner un exemple de quelque chose qui ne fonctionne pas et ce que vous voulez qu'il fasse? C'est, * fournir du code *. – Ether

+0

ce qui suit est le code: echo% newpassword% <- ce contiendrait abc12345 $ $ perl -p -i.bak -e "s/myPassWord /% newpassword%/g!" A.properties si la nouvelle variable de mot de passe contient $ abc12345 $ et que je lance la substitution cela ne fonctionne pas – user275633

Répondre

13

Utilisez ' comme regexp délimiteur symbole. Il va désactiver toute substitution de variable:

perl -p -i.bak -e "s'!MYPASSWORD!'%NEWPASSWORD%'g" a.properties 
+0

ivan - merci beaucoup. C'est ce dont j'avais besoin. – user275633

+0

Nice! . . . . . – mob

+3

Nice DWIMing, Ivan. Une alternative serait de ne pas laisser le shell remplir la valeur de la variable d'environnement: 's /! MYPASSWORD!/$ ENV {NEWPASSWORD}/g' –

2

Je présume que vous obtenez un mot de passe de la part de l'utilisateur. Pourquoi ne pas le faire en Perl sans avoir à passer par batch puisque vous utilisez déjà Perl? C'est plus facile. vous pouvez ensuite utiliser des modules comme Term::Inkey pour masquer le mot de passe et d'autres choses.

+2

Sûrement, vous plaisantez? Il n'y a aucun moyen que la gestion des erreurs de Perl et le contrôle de flux soient à la hauteur de la tâche. Un langage lourd comme le lot DOS est beaucoup plus approprié pour des tâches comme celle-ci. – daotoad

+0

Ok, tous blague à part, en utilisant un langage plus puissant, comme Perl, rendra ces sortes de scripts beaucoup plus faciles à maintenir et à réutiliser. – daotoad

+0

vous plaisantez aussi. Perl est tellement plus puissant que batch. En termes de traitement des erreurs en batch, en avez-vous déjà vu d'autres que% errorlevel%? – ghostdog74

Questions connexes