J'essaie de rechercher dans tous les fichiers d'un répertoire le texte correspondant au modèle d'un répertoire quelconque. J'espère pouvoir utiliser le résultat obtenu pour dresser une liste de tous les répertoires référencés dans les fichiers (cette partie, je pense que je peux me débrouiller seule).
J'ai examiné diverses ressources d'expression régulière et créé ma propre expression qui semble fonctionner dans l'outil basé sur un navigateur, mais pas avec grep dans la ligne de commande.
/\w+[(/\w+)]+
D'après ce que j'ai compris jusqu'à présent, l'expression ci-dessus cherchera le début / d'un répertoire, puis un nombre indéterminé de caractères avant de rechercher un bloc répétitif de la même chose.
Toute orientation serait grandement appréciée.
command-line
regex
grep
BrandonKowalski
la source
la source
Réponses:
Si je vous ai bien compris, vous voulez une expression régulière qui vous permettra
grep
d’identifier des chemins. Je ne suis pas sûr de ce que vous essayez de faire avec la regex que vous avez posté. Pourquoi voulez-vous que quelque chose soit répété? Les chemins ont seulement besoin d' une seule barre oblique:/etc
.Quoi qu'il en soit, si vous voulez tout type de chemin (chemins peuvent également contenir des caractères non-mot comme
{
,[
, des(
espaces et des nouvelles lignes , etc.), essayez ceci:Le
-E
ditgrep
que le modèle vous donner shoujld être interprétée comme une expression régulière étendue plutôt que de son défaut, Regular Expression de base. ERE prend en charge+
"un ou plusieurs" qui est nécessaire pour rechercher uniquement les chaînes avec au moins un caractère non-slash après le premier slash.Si vous souhaitez rechercher uniquement des chemins comportant plusieurs chemins
/
, vous pouvez faire quelque chose comme:Les chemins peuvent également se terminer par un slash si, pour une raison quelconque, vous souhaitez conserver ces slash de fin, utilisez (
/?
signifie "find zero ou un/
)":Plus précisément, la regex que vous utilisez échoue pour diverses raisons. Tout d’abord, comme @erewok l’a souligné, vous utilisez des parenthèses et des
+
crochets intérieurs. Comme les crochets spécifient une classe de caractères , leur contenu est traité comme l’un des caractères à rechercher (à l’exception de^
ce qui en fait une classe de caractères annulée ).Ainsi,
[(/\w+)]+
signifie que vous trouverez l' un des(
,/
, tout caractère de mot (\w
),+
ou)
une ou plusieurs fois. Dans tous les cas,\w
n'est pas reconnu pargrep
sauf si vous utilisez des expressions régulières compatibles Perl . Vous pouvez les activergrep
avec le-P
drapeau. Par exemple, cela correspond à un chemin tel que/etc
:Si vous savez que vos chemins seront toujours constitués de caractères verbaux (az, AZ, 0-9 et
_
), vous pouvez utiliser une expression similaire à celle ci-dessus, mais comme vous ne pouvez jamais en être sûr, utilisez quelque chose de moins strict. est préférable.la source