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:
grep -E '/[^/]+' *txt
_____
| |--------> one or more
|-----------> A character class, '^' in a character class means NOT,
so this class means "anything that is not /".
Le -E
dit grep
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:
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, \w
n'est pas reconnu par grep
sauf si vous utilisez des expressions régulières compatibles Perl . Vous pouvez les activer grep
avec le -P
drapeau. 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.