J'ai ce regex:
(?<=prefix).*$
qui retourne tout caractère suivant la chaîne "préfixe" et cela fonctionne très bien sur tous les moteurs regex en ligne (par exemple https://regex101.com ). Le problème est lorsque j'utilise cette expression régulière dans bash:
grep '(?<=prefix).*$' <<< prefixSTRING
cela ne correspond à rien. Pourquoi cette expression régulière ne fonctionne pas avec grep?
grep
regular-expression
mark009
la source
la source
.*$
correspond à n'importe quelle chaîne jusqu'à la fin de la ligne (ou à la fin de la chaîne), pas seulement n'importe quel caractère.Réponses:
Vous semblez avoir défini l'expression rationnelle correcte, mais vous n'avez pas défini les indicateurs suffisants en ligne de commande pour
grep
le comprendre. Parce que par défautgrep
prend en charge BRE et avec-E
indicateur, il fait ERE. Ce que vous avez (perspectives) n'est disponible que dans la version regex PCRE qui n'est prise en charge que dans GNUgrep
avec son-P
indicateur.En supposant que vous devez extraire uniquement la chaîne correspondante après avoir
prefix
besoin d'ajouter un indicateur supplémentaire-o
pour indiquergrep
que n'imprime que la partie correspondante commeIl existe également une version
grep
qui prend en charge les bibliothèques PCRE par défaut -pcregrep
dans laquelle vous pouvez simplement faireDes explications détaillées sur les différentes saveurs d'expression régulière sont expliquées dans cette merveilleuse réponse de Giles et les outils qui les implémentent
la source
Les expressions régulières sont disponibles dans de nombreuses saveurs différentes. Ce que vous montrez est une expression régulière de type Perl (PCRE, "Perl Compatible Regular Expression").
grep
fait des expressions régulières POSIX. Ce sont des expressions régulières de base (BRE) et des expressions régulières étendues (ERE, sigrep
est utilisé avec l'-E
option). Consultez le manuel dere_format
ouregex
tout autre manuel similaire auquel votregrep
manuel se réfère sur votre système, ou les textes standard POSIX auxquels je viens de faire un lien.Si vous utilisez GNU
grep
, vous seriez en mesure d'utiliser des expressions régulières de type Perl si vousgrep
l'grep
utilisiez avec l'-P
option spécifique à GNU .Notez également que
grep
renvoie les lignes par défaut, pas les sous-chaînes de lignes. Encore une fois, avec GNUgrep
(et certaines autresgrep
implémentations), vous pouvez utiliser l'-o
option pour obtenir uniquement le ou les bits qui correspondent à l'expression donnée de chaque ligne.Notez que les deux
-P
et-o
sont des extensions non standard de la spécification POSIX degrep
.Si vous n'utilisez pas GNU
grep
, vous pouvez utiliser à lased
place pour obtenir le bit entre la chaîneprefix
et la fin de la ligne:Ce que cela fait est d'imprimer uniquement les lignes qui
sed
parviennent à appliquer la substitution donnée. La substitution remplacera la ligne entière qui correspond à l'expression (qui est un BRE), avec le morceau qui se produit après la chaîneprefix
.Notez que s'il y a plusieurs instances de
prefix
sur une ligne, lased
variation retournerait la chaîne après la dernière , tandis que lagrep
variation GNU retournerait la chaîne après la première (qui inclurait les autres instances deprefix
).La
sed
solution serait portable sur tous les systèmes de type Unix.la source
Comme les autres réponses l'ont indiqué,
grep
n'utilise pas d'arôme regex avec lookbehinds (par défaut avec GNUgrep
, ou pas du tout avec d'autres versions).Si vous vous trouvez incapable d'utiliser GNU
grep
oupcregrep
, vous pouvez l'utiliserperl
si vous l'avez.La ligne de commande équivalente à
perl
serait:Vous placez l'expression régulière souhaitée entre les barres obliques. Lorsque vous utilisez Perl, cela utilise la saveur regex de Perl .
la source
print "$&\n" if ...
s'ils veulent sortir uniquement la partie après leprefix