2011-01-05 24 views

Odpowiedz

27

Oto prosty przykład:

$ 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 

W pierwszym poleceniu tylko pierwszy mecz zostanie naruszona. W drugim poleceniu wpływ ma każdy mecz. W obu przypadkach \1 odnosi się do znaków przechwyconych przez ujęte w nawiasach nawiasy.

W trzecim poleceniu określono dwie grupy przechwytywania. Są one określane przy użyciu \1 i \2. Można użyć do dziewięciu grup przechwytywania.

Oprócz (globalne) operatora g (lub bez niego, pierwszy mecz), można określić konkretny mecz:

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

Co to jest \\ 1, czy jest to rozszerzone wyrażenie regularne? – Timo

+0

Oto przykład dla \\ 1: "sed -E -e" s/[^ /] {10} (\\. [^ \\.] +)? $/\\ 1/"' – Timo

+1

@Timo : '\ 1' wstawia zawartość pierwszej grupy przechwytywania, która jest zgodna z pierwszym zestawem nawiasów. Nie wiem, czy pytasz w szczególności o sprawę z podwójnymi ukośnikami, ale wydaje się, że działa, czy są podwojone, czy nie. Nie powiedziałbym, że jest to przypadek rozszerzonego wyrażenia regularnego, ponieważ robi to samo, nawet jeśli używasz podstawowego wyrażenia regularnego. –

10

\(...\) będzie przechwytywać znaki określone wewnątrz parens i \1 byłaby używana do odniesienia do pierwszego dopasowania, jest to część regex.

+1

dobra odpowiedź. Chciałem tylko dodać, że oznacza to, że konkretny cytowany przykład usuwa spację po znaku przecinka lub znaku równości, ponieważ '\ 1' przywraca wszystko, co zostało dopasowane pomiędzy parens, które nie zawierało spacji. –

+0

Czy potrzebny jest/g, jeśli odwołujesz się tylko do pierwszego meczu? –

+0

vel "wsteczna referencja" – SiegeX