Fichiers de recherche pour le format de correspondance de texte d'un répertoire Unix


0

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.


Vos parenthèses et "+" figurent dans votre classe de caractères: "[" et "]" définissent une classe de caractères que vous recherchez; inclure "(", ")" et "+" entre "[]" signifie que vous voulez faire correspondre ces caractères entre autres. Je pense que vous voulez probablement les parenthèses et le "+" en dehors de votre classe de personnage: ([/ \ w] +). Cela devrait correspondre et capturer toute combinaison de "/" et de caractères alphaneumériques. Je n'ai pas posté cette réponse car je me perds en essayant d'utiliser regex avec grep tout le temps.
erewok

Réponses:


1

Si je vous ai bien compris, vous voulez une expression régulière qui vous permettra grepd’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:

grep -E '/[^/]+' *txt
          _____
           |  |--------> one or more
           |-----------> A character class, '^' in a character class means NOT,
                         so this class means "anything that is not /".

Le -Edit grepque 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:

grep -E '/[^/]+/[^/]+' *txt  

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 /)":

grep -E '/[^/]+/[^/]+/?' *txt  

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, \wn'est pas reconnu par grepsauf si vous utilisez des expressions régulières compatibles Perl . Vous pouvez les activer grepavec le -Pdrapeau. Par exemple, cela correspond à un chemin tel que /etc:

grep -P '/\w+' *txt

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.