2011-01-05 22 views

risposta

27

Ecco un semplice esempio:

$ echo 'abcabcabc' | sed 's/\(ab\)c/\1/' 
ababcabc 
$ echo 'abcabcabc' | sed 's/\(ab\)c/\1/g' 
ababab 
$ echo 'abcabcabc' | sed 's/\(ab\)\(c\)/\1d\2/g' 
abdcabdcabdc 

Nel primo comando, solo la prima partita è interessato. Nel secondo comando, ogni match è interessato. In entrambi i casi, \1 fa riferimento ai caratteri catturati dalle parentesi di escape.

Nel terzo comando, vengono specificati due gruppi di cattura. Sono indicati con \1 e \2. È possibile utilizzare fino a nove gruppi di cattura.

Oltre all'operatore g (globale) (o senza di essa, la prima partita), è possibile specificare una partita particolare:

$ echo 'aaaaaa' | sed 's/a/A/4' 
aaaAaa 
+0

Che cosa fa \\ 1, è un'espressione regolare? – Timo

+0

Ecco un esempio per \\ 1: 'sed -E -e" s/[^ /] {10} (\\. [^ \\.] +)? $/\\ 1/"' – Timo

+1

@Timo : '\ 1' inserisce il contenuto del primo gruppo di cattura che corrisponde alla prima serie di parentesi. Non so se stai chiedendo in particolare il caso con i backslash raddoppiati, ma sembra funzionare se sono raddoppiati o meno. Non direi che è un caso di regex estesa perché fa la stessa cosa anche quando si utilizza la regex di base. –

10

\(...\) catturerebbe i caratteri specificati all'interno del paren e \1 verrebbe utilizzato per fare riferimento alla prima corrispondenza, questa è una parte della regex.

+1

Buona risposta. Volevo solo aggiungere che questo significa che l'esempio specifico citato rimuove uno spazio che segue un segno di virgola o uguale, perché il '\ 1' rimette a posto qualsiasi cosa fosse abbinata tra i parenti, che non includeva lo spazio. –

+0

Quindi è necessario/g se si fa riferimento solo alla prima corrispondenza? –

+0

alias "riferimenti precedenti" – SiegeX