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 '
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.
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
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"
Si l'option -r
/--regexp-extended
N'est pas fournie, les parenthèses de capture doivent être échappées.