erreur sed: “référence non valide \ 1 sur le RHS de la commande` s ‘”

Je lance plusieurs commandes de substitution en tant que kernel d’un script de colorisation pour maven . L’une des commandes sed utilise une expression régulière qui fonctionne dans le shell, comme indiqué ici . L’implémentation actuelle (ne fonctionne pas) peut être trouvée ici .

Lorsque j’inclus une des variantes de la commande dans le script, un autre comportement 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 $ 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, caractère 59: référence non valide \ 1 sur le RHS de la commande `s ‘

    Vous n’avez pas besoin de 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 back-references (comme \ 1) ne fonctionneront pas.

    Cette erreur est commune aux 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 

    Devrait être échappé avec des antislashs avant chaque parenthèse:

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

    Vous devez échapper au / après le .

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

    Ou si vous ne voulez pas vous soucier de 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"