Forse non così intuitivo e senza dubbio oscura come l'inferno, ma nello spirito di completezza, mentre aspettiamo che BASH di cattura in sostituzione di arrivare, il seguente è attualmente possibile.
#!/bin/bash
name='joshua'
[[ $name =~ ([ao].*)([oa]) ]] && \
echo ${name/$BASH_REMATCH/X${BASH_REMATCH[1]}X${BASH_REMATCH[2]}}
In questo esempio sappiamo cosa stiamo cercando. Più vicino alla corrispondenza tutti o alle controparti di espressioni regolari globali, il seguente esempio corrisponderà all'avidità dell'ultima occorrenza della raccolta senza il prefisso X e continuerà indietro finché non ne rimarrà nessuno.
#/bin/bash
name='joshua'
while [[ $name =~ .*[^X]([oa]) ]]; do
name=${name/$BASH_REMATCH/${BASH_REMATCH:0:-1}X${BASH_REMATCH[1]}}
done
echo $name
Questo esempio funziona simile a quello sguardo dietro espressione /(?<!X)([oa])/X\1/
che assume per la cura solo il o ed un personaggio che non hanno un X prefissato.
uscita per entrambi gli esempi
jXoshuXa
nJoy!
fonte
2014-03-07 22:07:54
Non vedo nulla nella mia versione di bash (4.1.5) sull'essere in grado di fare sostituzioni regex usando la sintassi '$ {foo/bar/baz}'. Hai qualche riferimento per il motivo per cui pensi che dovresti essere in grado di farlo? –
Non sono sicuro di dove mi sia imbattuto, ma funziona. Usando il mio esempio sopra puoi vedere che sta sostituendo 'o' e' a' con 'X'. Piuttosto lucido. – joshuapoehls
Vedere http://tldp.org/LDP/abs/html/parameter-substitution.html, la descrizione di questo è circa 3/4 del modo in giù la pagina. –