Comment puis-je échapper des caractères spéciaux pour une substitution dans un doubleur Perl?
Est-il possible de remplacer une chaîne de caractères comme @
ou *
ou ?
ou &
sans avoir besoin de faire un "\" devant elle?
Exemple:
perl -pe 'next if /^#/; s/\@d\&/new_value/if /param5/' test
Dans cet exemple, j'ai besoin de remplacer un @d&
avec new_value
mais l'ancienne valeur peut contenir n'importe quel caractère, comment échapper que les caractères doivent être échappés?
source d'informationauteur yael
Vous devez vous connecter pour publier un commentaire.
Vous avez plusieurs problèmes:
\b
incorrectementDe
perldoc perlre
Ni des personnages
@
ou&
sont\w
caractères. Si votre match est voué à l'échec. Vous pouvez utiliser quelque chose commes/(^|\s)\@d\&(\s|$)/${1}new text$2/
(^|\s)
dit correspondre au début de la chaîne (^
)ou un caractère d'espacement (\s
).(\s|$)
dit pour correspondre à la fin de la chaîne ($
) ou un caractère d'espacement (\s
).Pour résoudre le deuxième problème, vous devez utiliser
%ENV
.Pour résoudre le troisième problème, vous devez utiliser le
\Q
et\E
des séquences d'échappement pour échapper à la valeur en$ENV{a}
.Mettant tous ensemble, nous obtenons:
Qui imprime
Tel que discuté à perldoc perlre:
Vous pouvez également utiliser un
'
comme délimiteur dans le s///opération afin de faire tout ce qui sera analysé littéralement:Dans votre exemple, vous pouvez le faire (notez les guillemets simples):
Les autres réponses ont couvert la question, maintenant, voici votre méta-problème: Se Penchant Un Cure-Dent Syndrome De. Son lorsque le séparateur et s'échappe de commencer à brouiller ensemble:
La solution est d'utiliser un autre délimiteur. Vous pouvez utiliser à peu près tout, mais équilibré des accolades de travail meilleures. La plupart des éditeurs peuvent les analyser et en général, vous n'avez pas à vous soucier de s'échapper.
Voici votre regex avec embrassa délimiteurs.
Beaucoup plus facile sur la eyeholes.
Si vous voulez vraiment éviter de taper le
\
s, mettez votre chaîne de recherche dans une variable et ensuite l'utiliser dans votre regex à la place. Vous n'avez pas besoinquotemeta
ou\Q ... \E
dans ce cas. Par exemple:Si vous devez l'utiliser dans un one-liner, garder à l'esprit que vous aurez à s'échapper de la
$
s si vous utilisez "s pour contenir votre code perl, ou d'échapper à la'
s si vous utilisez'
s pour contenir votre code perl.