comment spécifier non-capture de groupes de sed?
est-il possible de spécifier non-capture de groupes de sed?
si oui, comment?
- Je suis / est conscient de la signification de l'alternance entre le littéral et le groupement de capture, selon qu'ils sont évadés ou pas, et que si -r ou non l'inverse.
- Pas de sed que je sais de prise en charge non-capturer les groupes. Cependant, Perl est facilement disponible, et est probablement la bonne réponse si vous en avez vraiment besoin.
- ouais vous avez raison
Vous devez vous connecter pour publier un commentaire.
Les parenthèses peuvent être utilisées pour grouper des solutions de rechange. Par exemple:
dit de remplacer "abcf" ou "adef" avec "X", mais les parenthèses aussi de capture. Il n'y a pas une installation en
sed
de faire un tel regroupement sans capture. Si vous avez un complexe de regex qui fait les deux alternatives de regroupement et de la capture, vous aurez simplement à être prudent dans le choix du groupe de capture dans votre remplacement.Peut-être que tu pourrais en dire plus sur ce que c'est que vous essayez d'accomplir (de quoi vous avez besoin pour les non-capture de groupes) et pourquoi vous voulez éviter les groupes de capture.
Edit:
Il est un type de non-capture de crochets (
(?:pattern)
) qui font partie de Perl-Compatible Regular Expressions (PCRE). Ils ne sont pas pris en charge danssed
(mais lors de l'utilisation degrep -P
).(?:)
style non-capture de supports, c'est la partie de la Perl-Compatible Regular Expressions (PCRE) qui n'est pas pris en charge danssed
(mais il est àgrep -P
).La réponse, c'est qu'en écriture, vous ne pouvez pas - sed ne le supporte pas. Sed prend en charge BRE, et ERE, mais pas PCRE.
(Note - Une reponse souligne que la BRE est également connu comme POSIX sed, et ERE est une extension GNU via sed -r. Point reste que PCRE n'est pas pris en charge par le sed. )
Perl travailleront, pour windows ou linux
exemples ici
https://superuser.com/questions/416419/perl-for-matching-with-regular-expressions-in-terminal
exemple, à partir de cygwin sous windows
Il y a un programme bien que pour Windows, ce qui peut faire rechercher et remplacer sur la ligne de commande, et prend en charge PCRE. Il est appelé rxrepl. Ce n'est pas sed bien sûr, mais il n'rechercher et remplacer avec PCRE de soutien.
L'auteur(pas moi), mentionné son programme dans une réponse ici https://superuser.com/questions/339118/regex-replace-from-command-line
Il a vraiment une bonne syntaxe.
Le standard chose serait perl, ou presque n'importe quel autre langage de programmation que les gens utilisent.
Je suppose que vous parlez de la backrefence syntaxe, qui sont entre parenthèses
( )
pas parenthèses[ ]
Par défaut,
sed
interprétera( )
littéralement et ne pas essayer de faire un backrefence d'eux. Vous devrez échapper à faire de spécial, comme dans\( \)
C'est seulement lorsque vous utilisez GNUsed -r
option de l'échappement être inversé. Avecsed -r
, non échappé( )
produira backrefences et s'est échappé\( \)
seront traités comme littéral. Des exemples à suivre:POSIX
sed
GNU
sed -r
Mise à jour
De commentaires:
Groupe uniquement, non-capture de parenthèses
( )
de sorte que vous pouvez utiliser quelque chose comme des intervalles de{n,m}
sans créer une référence arrière\1
n'existent pas. Tout d'abord, les intervalles ne sont pas en dehors de POSIX sed, vous devez utiliser la GNU-r
prolongation. Dès que vous activez-r
tout groupement parenthèses seront également de la capture pour la référence arrière de l'utiliser. Exemples:-r
option est une extension GNU. Il ne fait pas partie de la POSIX sed syntaxe. Le-e
indicateur permet de spécifier plus d'unsed
script en ligne, il n'a rien à voir avec BRE vs ERE. Par exempleecho "foo" | sed -e 's/foo/bar/' -e 's/bar/baz/'
( )
"crochets" est bien sûr faux, mais je dirais qu'en gros, la terminologie commune comme suit: Supports[]
, les Parenthèses()
, Accolades{}
. Wikipédia semble pour ainsi (voir l'extrême droite de l'image à mi-chemin).Comme l'a dit, il n'est pas possible d'avoir des non-capture de groupes de sed.
Il peut être évident, mais non de capturer les groupes ne sont pas une nécessité. On peut simplement utiliser le désiré de la capture et ignorer le non de votre choix comme si elles étaient des non-capture. Pour référence, imbriqués de capturer les groupes sont numérotés en fonction de la position de l'ordre de "(".
E. g.,
applex et de la bananesx et les singes (note: le "s" dans les bananes, le premier grand groupe)
vs
applex et bananax et les singes (note: pas de "s" dans les bananes, le deuxième plus petit groupe)
sed -r
pour réduire les barres obliques inverses.