130 votes

erreur sed : "référence invalide \1 sur le RHS de la commande `s'"

J'exécute plusieurs commandes de substitution comme noyau d'une coloriser script pour maven . L'un des sed utilise une expression régulière qui fonctionne trouver dans le shell comme discuté ici . L'implémentation actuelle (qui ne fonctionne pas) se trouve à l'adresse suivante aquí .

Lorsque j'inclus une des variantes de la commande dans le script un comportement différent se produit :

Variante 1 :

$ sed -re "s/([a-zA-Z0-9./\\ :-]+)/\1/g"

Adapté au script :

-re "s/WARNING: ([a-zA-Z0-9./\\ :-]+)/${warn}WARNING: \1${c_end}/g" \

Erreur : Le shell affiche les mêmes informations que si je tapais $ sed . Étrange ! ?


Variante 2 :

$ sed -e "s/\([a-zA-Z0-9./\\ :-]\+\)/\1/g"

Adapté au script :

-e "s/WARNING: \([a-zA-Z0-9./\\ :-]\+\)/${warn}WARNING: \1${c_end}/g" \

Erreur :

sed : -e expression #7, char 59 : référence invalide \1 sur le RHS de la commande `s'.

87voto

Denis Points 34131

Ne faut-il pas que la capture soit effective pour que cela fonctionne ? par exemple pour la variante n°2 :

-r -e "s/WARNING: (\([a-zA-Z0-9./\\ :-]\+\))/${warn}WARNING: \1${c_end}/g" \

(Note : non testé)

Sans le -r les renvois d'arguments (comme \1 ) ne fonctionnera pas, à moins que chaque parenthèse ne soit échappée par un symbole \ caractère.

Avec -r les renvois d'arguments (comme \1 ) ne fonctionnera pas si les parenthèses ne sont pas échappées.

58voto

Emi Points 11

Cette erreur est courante pour les parenthèses qui ne sont pas échappées. Échappez-les et réessayez.


Par exemple :

/^$/b
:loop
$!{
N
/\n$/!b loop
}
s/\n(.)/\1/g

Doit être échappé avec des backslashes avant chaque parenthèse :

/^$/b
:loop
$!{
N
/\n$/!b loop
}
s/\n\(.\)/\1/g

26voto

OrangeDog Points 7380

Si le -r / --regexp-extended n'est pas fournie, alors les parenthèses de capture doivent être échappées.

7voto

sgmart Points 734

Vous devez échapper à la / après le .

sed -e "s/\([a-zA-Z0-9.\/\\ :-]\+\)/\1/g"

Ou si vous ne voulez pas vous soucier de l'échappement, utilisez |

sed -e "s|\([a-zA-Z0-9./\\ :-]\+\)|\1|g"

EDITAR:

sed -e "s|WARNING: \([a-zA-Z0-9.-/\\ :]+\)|${warn}WARNING: \1${c_end}|g"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X