Eseguo diversi comandi di sostituzione come nucleo di uno script colorize per Maven . Uno dei sed
comandi utilizza un'espressione regolare che funziona nella shell come discusso qui . L'attuale implementazione (non funzionante) può essere trovata qui .
Quando includo una delle varianti del comando nello script si verifica un comportamento diverso:
Variante 1:
$ sed -re "s/([a-zA-Z0-9./\\ :-]+)/\1/g"
Adattato alla sceneggiatura:
-re "s/WARNING: ([a-zA-Z0-9./\\ :-]+)/${warn}WARNING: \1${c_end}/g" \
Errore: la shell restituisce le stesse informazioni come se dovessi digitare $ sed
. Strano!?
Variante 2:
$ sed -e "s/\([a-zA-Z0-9./\\ :-]\+\)/\1/g"
Adattato alla sceneggiatura:
-e "s/WARNING: \([a-zA-Z0-9./\\ :-]\+\)/${warn}WARNING: \1${c_end}/g" \
Errore:
sed: -e espressione # 7, char 59: riferimento non valido \ 1 sull'RHS del comando `s '
'
e le virgolette doppie "
vengono trattate in modo leggermente diverso, soprattutto durante l'interpretazione $vars
. Ad esempio: sudo sh -c "sed -r -i 's/(^.+_supplicant.conf)/\1${MTXT}/' /etc/network/interfaces"
funziona, ma: sudo sh -c 'sed -r -i "s/(^.+_supplicant.conf)/\1${MTXT}/" /etc/network/interfaces'
non funziona.
-i
(opzione di modifica in posizione) con-re
, risultante in-ire
(quindi-i
consumava ilre
frammento comeSUFFIX
argomento e quindi la modalità regex estesa non era abilitata); cambiandolo per-i -re
risolvere il problema.