Je veux savoir quels fichiers ont la chaîne $Id$
.
grep \$Id\$ my_dir/mylist_of_files
renvoie 0 occurrence.
Jai découvert que je devais utiliser
grep \$Id$ my_dir/mylist_of_files
Ensuite, je vois que le $Id
est coloré dans la sortie, cest-à-dire quil a été mis en correspondance.
Comment pourrais-je faire correspondre le deuxième $
et pourquoi ne « t \$Id\$
fonctionne.
Cela na pas dimportance si le deuxième $
est le dernier caractère ou non.
Jutilise grep
2.9.
Avant en postant ma question, jai utilisé google …
Pour rechercher un $ (signe dollar) dans le fichier nommé test2, entrez:
grep \\ $ test2
Les caractères \\ (double barre oblique inverse) sont nécessaires pour forcer le shell à passer un \ $ (barre oblique inverse simple, signe dollar) à la commande grep. Le caractère \ (barre oblique inverse unique) indique à la commande grep de traiter le caractère suivant (dans cet exemple, le $) comme un caractère littéral plutôt que comme un caractère dexpression. Utilisez la commande fgrep pour éviter de devoir utiliser des caractères déchappement tels que la barre oblique inverse.
mais je ne comprends pas pourquoi grep \$Id
fonctionne et pourquoi grep \\$Id\\$
ne « t ».
Je « suis un peu confus …
Réponse
Il ya deux problèmes distincts ici.
-
grep
utilise Expressions régulières de base (BRE) et$
est un caractère spécial dans BRE « s uniquement à la fin dune expression. La conséquence en est que les 2 instances de$
dans$Id$
ne sont pas égales. le premier est un caractère normal et le second est une ancre qui correspond à la fin de la ligne. Pour que le second$
corresponde à un littéral$
vous « devrez lui échapper une barre oblique inverse, cest-à-dire$Id\$
. Échapper au premier$
fonctionne également:\$Id\$
, et je préfère cela car il semble plus cohérent.¹ -
Il y a deux mécanismes déchappement / guillemets totalement indépendants à lœuvre ici: les guillemets shell et les guillemets regex anti-slash. Le problème est que de nombreux caractères que les expressions régulières utilisent sont également spéciaux pour le shell, et en plus de cela, le caractère déchappement de lexpression régulière, la barre oblique inverse, est également un caractère de guillemet du shell. Cest pourquoi vous voyez souvent des désordres impliquant des doubles barres obliques inverses, mais je ne recommande pas dutiliser des barres obliques inverses pour le shell citant des expressions régulières car ce nest pas très lisible.
Au lieu de cela, le moyen le plus simple de le faire est de mettre dabord votre expression régulière entière entre guillemets simples comme dans
"regex"
. Le guillemet simple est la forme la plus puissante de guillemets du shell, donc tant que votre expression régulière ne contient pas de guillemets simples, vous navez plus à vous soucier des guillemets du shell et pouvez vous concentrer sur la syntaxe BRE pure.
Donc, en appliquant ceci à votre exemple dorigine, jetons le bon regex (\$Id\$
) entre des guillemets simples. Ce qui suit devrait faire ce que vous voulez:
grep "\$Id\$" my_dir/my_file
La raison pour laquelle \$Id\$
ne fonctionne pas est parce quaprès la suppression des guillemets de shell (la manière la plus correcte de dire shell entre guillemets) est appliquée, lexpression régulière que grep
voit est $Id$
. Comme expliqué dans (1.), cette expression régulière correspond à un littéral $Id
uniquement à la fin dune ligne car le premier $
est littéral tandis que le second est un caractère dancrage spécial.
¹ Notez également que si jamais vous passez aux expressions régulières étendues (ERE), par exemple si vous avez décidé dutiliser egrep
(ou grep -E
), le caractère $
est toujours spécial. Dans ERE « s $Id$
ne correspondrait jamais à rien car vous ne pouvez » t avoir de caractères après la fin dune ligne, donc \$Id\$
serait la seule façon de procéder.
Commentaires
Réponse
Pour rechercher $Id$
dans un fichier: vous pouvez utiliser: grep "\$id*" filename
Commentaires
- Qui correspondra à tout ce qui commence par
$id
, donc$idea
par exemple également, pas seulement$id$
.
grep -F '$Id$'
.grep '$Id\$' ...
etgrep \$Id\\$ ...
work$
avec un$
:grep '$$Id\$$'
. stackoverflow.com / a / 2382810/2097284