2 votes

Utiliser ~ dans les recherches et remplacements en Perl

Je veux remplacer un caractère de remplacement dans tous les fichiers d'un répertoire par une chaîne de caractères générée par l'utilisateur. Cette entrée peut contenir / : . ~

J'ai choisi Perl pour cette tâche.

perl -p -i -e "s/__MY_PLACEHOLDER__/$user_input/g" `find my_dir -type f -print0 | xargs -0`

Ahora, ~ est un caractère réservé en Perl. Comment puis-je échapper à ~ sur $user_input ? \~ ne fonctionne pas.

9voto

ikegami Points 133140

En fait, ~ n'est pas spécial dans les chaînes de caractères entre guillemets, comme l'expression de remplacement de la fonction s/// . Quelques autres sont cependant spéciaux. Des quatre personnages que vous avez cités, / est spécial lorsque / est utilisé comme délimiteur, comme c'est le cas ici.


N'essayez pas de générer du code Perl à partir du shell ! Utilisez l'une des méthodes suivantes :

export $user_input
perl -i -pe's/__MY_PLACEHOLDER__/$ENV{user_input}/g'

ou

USER_INPUT=$user_input perl -i -pe's/__MY_PLACEHOLDER__/$ENV{USER_INPUT}/g'

ou

perl -i -pe'
   BEGIN { $user_input = shift }
   s/__MY_PLACEHOLDER__/$user_input/g
' "$user_input"

Au fait, tu n'as vraiment pas compris le point de vue de xargs !

perl ... `find my_dir -type f -print0 | xargs -0`

n'est pas différent de

perl ... `find my_dir -type f`

Ce que vous vouliez, c'est

find my_dir -type f -print0 | xargs -0 perl ...

Ceci passera les noms de fichiers à perl démêlés. Il appellera même perl plus d'une fois avec différents lots d'arguments si nécessaire pour éviter de se heurter aux limites de longueur de la ligne de commande.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X