web-dev-qa-db-fra.com

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

J'exécute plusieurs commandes de substitution comme noyau d'un script de colorisation pour maven . Une des commandes sed utilise une expression régulière qui fonctionne dans le shell en tant que décrit ici . La mise en œuvre actuelle (qui ne fonctionne pas) peut être trouvée ici .

Lorsque j'inclus l'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 fournit 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 non valide\1 sur la commande RHS de la commande `s '

77
JJD

Ne devez-vous pas capturer pour que cela fonctionne? c'est-à-dire pour la variante 2:

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

(Note: non testé)

Sans l'argument -r, les références arrières (comme\1) ne fonctionneront pas.

37

Cette erreur est commune aux parenthèses non échappées. Echappez-les et essayez à nouveau.


Par exemple:

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

Devrait être échappé avec des barres obliques inverses avant chaque parenthèse:

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

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

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

Ou si vous ne voulez pas vous échapper, utilisez |

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

MODIFIER:

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

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

1
OrangeDog