2011-06-06 19 views
5

Chcę dokonać zmiany na podstawie wieloznacznika. Na przykład, zmień wszystkie "kadencje" na "dyspozycje" tylko wtedy, gdy słowo "tytuł" pojawia się po znaku "=". Zasadniczo regex, który będzie pasował do tej =.*tenuresubstytucja sed z podstawnikiem

SED polecenie, że mam tak na to:

sed 's/=.*tenure/=.*disposition/g' file.txt 

Jednakże, jeśli przekażę to do pliku zawierającego:

blah blah blah = change "tenure" to "disposition" 

otrzymuję

blah blah blah =.*disposition" to "disposition" 

zamiast:

blah blah blah = change "disposition" to "disposition" 

W jaki sposób dokonać podstawiania, aby wieloznaczny w regex nie był częścią pliku docelowego?

Odpowiedz

6

Musisz użyć grupę przechwytywania przechwycić tekst, który pojawia się między swoimi znak równości i „kadencji”.

Więc

sed 's/=\(.*\)tenure/=\1disposition/g' 

Uwaga wykorzystanie \1 odwoływać i używać odpowiednią grupę przechwycony.

Więc w

echo 'blah blah blah = change "tenure" to "disposition"' | sed 's/=\(.*\)tenure/=\1disposition/g' 

otrzymujemy

blah blah blah = change "disposition" to "disposition". 

Zobacz Regex grouping.

2
sed 's/\(=.*\)tenure/\1disposition/g' file.txt 
2

Musisz zapisać dopasowanych znaków pomiędzy = i tenure, aby dodać je do wyjścia:

sed 's/=(.*)tenure/=\1disposition/g' file.txt 

Ponadto, należy dodać opcję -i do sed jeśli chcesz edytować plik inplace (wykonaj modyfikacje samego pliku).