2011-04-11 14 views
8

Come posso includere la corrispondenza regolare nell'espressione sostitutiva in BASH?Come fare riferimento alle acquisizioni nella sostituzione reex bash

non lavora esempio:

#!/bin/bash 
name=joshua 
echo ${name//[oa]/X\1} 

mi aspetto di uscita jXoshuXa con \1 essere sostituito dal carattere abbinato.

Questo in realtà non funziona e restituisce invece jX1shuX1.

+2

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? –

+0

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

+0

Vedere http://tldp.org/LDP/abs/html/parameter-substitution.html, la descrizione di questo è circa 3/4 del modo in giù la pagina. –

risposta

7
bash> name=joshua 
bash> echo $name | sed 's/\([oa]\)/X\1/g' 
jXoshuXa 
+0

Se stai per raggiungere sed, questo è più semplice: 's/[oa]/X &/g' –

+0

Grazie! Speravo di essere in grado di farlo senza chiamare 'sed', ma questo dovrebbe funzionare altrettanto bene. – joshuapoehls

22

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!

Problemi correlati