Nie, wyrażenia regularne sed nie mają nieprzystosowanego dopasowania.
Możesz dopasować cały tekst do pierwszego wystąpienia AC
, używając „niczego niezawierającego AC
”, po AC
którym następuje , co robi to samo co Perla .*?AC
. Chodzi o to, że „niczego nie zawierającego AC
” nie można łatwo wyrazić jako wyrażenie regularne: zawsze istnieje wyrażenie regularne, które rozpoznaje negację wyrażenia regularnego, ale wyrażenie regularne negacji szybko się komplikuje. A w przenośnym sed nie jest to w ogóle możliwe, ponieważ regex negacji wymaga zgrupowania alternacji występującej w rozszerzonych wyrażeniach regularnych (np. W awk), ale nie w przenośnych podstawowych wyrażeniach regularnych. Niektóre wersje sed, takie jak GNU sed, mają rozszerzenia BRE, które umożliwiają wyrażanie wszystkich możliwych wyrażeń regularnych.
sed 's/AB\([^A]*\|A[^C]\)*A*AC/XXX/'
Ze względu na trudność negowania wyrażenia regularnego nie uogólnia to dobrze. Zamiast tego możesz tymczasowo przekształcić linię. W niektórych implementacjach sed możesz używać znaków nowej linii jako znacznika, ponieważ nie mogą one pojawiać się w linii wejściowej (a jeśli potrzebujesz wielu znaczników, użyj nowej linii, po której następuje zmienny znak).
sed -e 's/AC/\
&/g' -e 's/AB[^\
]*\nAC/XXX/' -e 's/\n//g'
Uważaj jednak na to, że backslash-newline nie działa w zestawie znaków w niektórych wersjach sed. W szczególności nie działa to w GNU sed, który jest implementacją sed w niewbudowanym systemie Linux; w GNU sed możesz \n
zamiast tego użyć :
sed -e 's/AC/\
&/g' -e 's/AB[^\n]*\nAC/XXX/' -e 's/\n//g'
W tym konkretnym przypadku wystarczy zastąpić pierwszy AC
nowym znakiem. Podejście, które przedstawiłem powyżej, jest bardziej ogólne.
Bardziej potężnym podejściem w sed jest zapisanie linii w przestrzeni wstrzymania, usunięcie wszystkich oprócz pierwszej „interesującej” części linii, zamiana przestrzeni wstrzymania i przestrzeni wzorców lub dołączenie przestrzeni wzorców do przestrzeni wstrzymania i powtórzenie. Jeśli jednak zaczniesz robić rzeczy, które są tak skomplikowane, powinieneś naprawdę pomyśleć o przejściu na awk. Awk nie ma również chciwego dopasowania, ale możesz podzielić ciąg i zapisać części na zmienne.