Que ce soit pour échapper (et) dans regex en utilisant GNU sed
J'ai remarqué plusieurs messages sur ce site qui disent qu'avec gnu sed vous devez utiliser (
et )
en regex plutôt que \(
et \)
. Mais ensuite j'ai regardé dans le gnu sed manuel et vu qu'ils précisent que les \(
et \)
doit être utilisé. Qu'est-ce?
source d'informationauteur grok12
Vous devez vous connecter pour publier un commentaire.
Cette partie de la gnu sed manuel est lié à explique que si vous devez échapper parenthèses dépend de si vous utilisez de base des expressions régulières ou des expressions régulières étendues. Cette partie dit que le
-r
drapeau détermine dans quel mode vous êtes.Edit: comme indiqué dans grok12 du commentaire, le
-E
drapeau dans bsd sed fait ce que l'-r
drapeau n'en gnu sed.À l'origine sed, comme grep et tout le reste, utilisé \( pour indiquer le groupement, considérant que ( seulement correspondait à un littéral ouvert parenthèse.
De plusieurs nouvelles implémentations des expressions régulières, y compris egrep et perl, sous tension, donc \( signifie littéralement ouvert parenthèse, et ( a été utilisé pour spécifier le groupement des.
Donc, maintenant, avec gnu sed, ( c'est un caractère spécial, comme egrep. Mais sur d'autres systèmes (par exemple, BSD) il est encore à l'ancienne, dans la mesure où je peux dire. Malheureusement, c'est un véritable gâchis, parce que maintenant il est difficile de savoir lequel utiliser.
Grâce à bascule, murga, et chris. Chacun de vous m'a aidé à comprendre la question. Je vais répondre à ma propre question ici pour (espérons-le) de mettre toute l'histoire en un seul endroit.
Il existe deux versions principales de sed à utiliser: gnu et bsd. Deux d'entre eux nécessitent des parens de base de la regex pour être protégé lorsqu'il est utilisé pour le regroupement, mais pas échappé lorsqu'utilisé dans l'étendue de la regex. Ils diff en ce que l'option-r permet étendu regex pour gnu mais E fait pour bsd.
La norme sed dans mac OSX bsd est. Je crois que la plupart du reste du monde utilise gnu sed comme la norme, mais je ne sais pas précisément qui utilise quoi. Si vous n'êtes pas sûr que vous utilisez, essayez:
Si vous obtenez une
répondre, alors vous avez bsd.
Échappé parenthèses (
\(
) faire de la regex de recherche pour des parenthèses, comme une partie de l'expression.Sans échappement parenthèses (
(
) faire de la regex groupe le contenu des parenthèses ensemble.En d'autres termes, si vous leur échapper, le moteur cherchemais si vous les laisser comme c'est, ils provoquent le moteur de groupe de résultats dans des variables.
Un exemple pour démontrer que:
$myString = "junk(150)moar";
Pour obtenir le nombre:
#^\w+\((\d+)\)\w+$#
(
$1
est150
)C'est un gâchis, je sais, mais il montre l'utilisation de groupement des parenthèses et des parenthèses, comme le cadre de la mise en correspondance d'expression.
Mise À Jour Des Années Plus Tard:
En tant qu'utilisateur @bmk souligne à justecette réponse s'applique aux expressions régulières étendues, mais pas à base d'expressions régulières. Il est difficile de trouver de base des expressions régulières par défaut le moteur de l'analyse dans la plupart des langages de programmation, etc., mais il serait prudent de vérifier le moteur que vous utilisez avant d'assumer cette réponse s'applique à votre situation.