2010-06-19 8 views
20

Mon but est de trouver toutes les occurrences "<?=" avec ack. Comment puis je faire ça?ack-grep: caractères échappés

ack "<?=" 

Ne fonctionne pas. S'il vous plaît dites-moi comment puis-je réparer échapper ici?

Répondre

27

Puisque ack utilise des expressions régulières Perl, votre problème provient du fait que dans le langage Perl RegEx, ? est un caractère spécial signifiant "la dernière correspondance est optionnelle". Donc, ce que vous cherchez est = précédé par un <

Donc vous devez échapper le ? si c'est juste destiné à être un caractère régulier.

Pour échapper, il existe deux approches - soit <\?= ou <[?]=; certaines personnes trouvent que la seconde forme d'échappement (mettre un caractère spécial dans une classe de caractères) est plus lisible que l'échappement par antislash.

MISE À JOUR Comme Josh Kelley a gracieusement ajouté dans le commentaire, une troisième forme d'échapper est d'utiliser l'opérateur \Q qui échappe à tous les caractères spéciaux suivants jusqu'à ce \E se rencontre, comme suit: \Q<?=\E

+4

Ou utilisez '\ Q

+13

Ou utilisez l'option -Q pour échapper tous les caractères spéciaux, aussi, car vraiment, qui veut jouer avec la merde \ Q \ E? –

7
ack "<\?=" 

? est un opérateur regex, donc il doit s'échapper

18

Plutôt que d'essayer pour se souvenir quels caractères doivent être échappés, vous pouvez utiliser -Q pour citer tout ce qui doit être cité.

11
ack -Q "<?=" 

Ceci est la meilleure solution si vous voulez trouver par le texte simple.

(si vous devez trouvez pas par expression régulière.)

Questions connexes