J'exécute plusieurs commandes de substitution au cœur d'un script colorize pour maven . L'une des sed
commandes utilise une expression régulière qui fonctionne dans le shell comme indiqué ici . L'implémentation 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 génère 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 \ 1 invalide sur le RHS de la commande `s '
-i
(option d'édition sur place) avec-re
, résultant en-ire
(ce qui-i
consommait lere
fragment commeSUFFIX
argument et donc le mode regex étendu n'était pas activé); le changer pour-i -re
résoudre le problème.'
et doubles"
sont traités légèrement différemment, en particulier lors de l'interprétation$vars
. Par exemple:sudo sh -c "sed -r -i 's/(^.+_supplicant.conf)/\1${MTXT}/' /etc/network/interfaces"
fonctionne, mais:sudo sh -c 'sed -r -i "s/(^.+_supplicant.conf)/\1${MTXT}/" /etc/network/interfaces'
ne fonctionne pas.Réponses:
N'avez-vous pas besoin de capturer pour que cela fonctionne? c'est-à-dire pour la variante 2:
(Remarque: non testé)
Sans l'argument -r, les références arrière (comme \ 1) ne fonctionneront pas.
la source
-r
option de sed semble être nécessaire pour que la référence arrière fonctionne. Par exemple,sed -e 's/([[:digit:]])/is a digit/'
fonctionne maissed -e 's/([[:digit:]])/\1 is a digit/
produit l'erreur d'origine sans-r
sed. REMARQUE: le premier appel de sed recherche un littéral(<digit>)
et n'est pas un groupe de capture.-ire
au lieu d'utiliser-ri
. La commande compte :-)Cette erreur est courante pour les parenthèses qui ne sont pas échappées. Échappez-les et réessayez.
Par exemple:
Doit être échappé avec des barres obliques inverses avant chaque parenthèse:
la source
-r
vous n'avez pas à échapper les parenthèses.Si l' option
-r
/--regexp-extended
n'est pas fournie, les parenthèses de capture doivent être échappées.la source
Vous avez besoin de vous échapper
/
après le.
Ou si vous ne voulez pas vous soucier de vous échapper, utilisez
|
ÉDITER:
la source
sed: -e expression #7, char 58: Invalid range end
. La réponse de @Denis fonctionne.