2013-02-18 12 views
7

Jestem i pracowałem nad plikiem skryptu sed i podczas uruchamiania go pojawia się błąd "Niepoprawne poprzedzenie wyrażenie regularne". Poniżej znajduje się plik w całości.Nieprawidłowe poprzednie wyrażenie regularne podane przez sed

Zrobiłem już wiele wyszukiwania na ten temat, zarówno na tej stronie i gdzie indziej. Wiele zadawanych tutaj pytań spowodowało, że trzeba rozszerzyć wyrażenia regularne, aby coś uniknęło niepoprawnie. Zdefiniowałem to jako rozszerzony wyraz, ponieważ jest potrzebny do zastąpienia wiadomości e-mail.

#!/bin/sed -rf 
#/find_this thing/{ 
#s/ search_for_this/ replace_with_this/ 
#s/ search_for_this_other_thing/ replace_with_this_other_thing/ 
#} 

#Search and replace #ServerAdmin (with preceding no space) email addresses using a regular expression that has the .com .net and so on domain endings as option so it will find [email protected] and replace it in line with admin's email address. 

ServerAdmin/ { 
s/\b[A-Za-z0-9._%-][email protected](?:[a-zA-Z0-9-]+\.)+(\.[A-Za-z]]{2,4})?\b/[email protected]/ 
} 
#Enable user's Public HTML directories 
/UserDir/ { 
s/disable$/enable/ 
s/^#User/User/ 
} 
#Replace the only #ServerName (with preceding no space) followed space and text with Our server ip 
/#ServerName */ c\ ServerName server.ip.address.here/ 

Wołam go z Termal jako ./config-apache.sed /etc/httpd/conf/httpd.conf i dostać to zwracane.

/bin/sed: file ./apache-install.sed line 12: Invalid preceding regular expression 

wewnątrz linii vim 12 jest i dentified jako jednolitego } powyżej #Enable user's Public HTML directories

Odpowiedz

13

Wydaje GNU sed nie lubi PCRE non przechwytywania notacji:

...(?:...)... 

Spróbuj:

s/\b[A-Za-z0-9._%-][email protected]([a-zA-Z0-9-]+\.)+(\.[A-Za-z]]{2,4})?\b/[email protected]/ 

GNU sed wydaje się, że bądź w porządku z tym. Jednak nadal masz mało pracy do zrobienia. Biorąc pod uwagę pierwszą linię poniżej jako wejście, wyjście jest druga linia:

abc [email protected] aaa 
abc [email protected] aaa 

Istnieją dwa problemy umożliwieniu temu wynik:

  1. ]] powinny być pojedynczym ].
  2. Poszukujesz kropki z kropkami w poprzednim wyrażeniu regularnym, więc nie chcesz tego w ostatniej części sufiksu domeny.

ta spełnia swoje zadanie:

s/\b[A-Za-z0-9._%-][email protected]([a-zA-Z0-9-]+\.)+([A-Za-z]{2,4})?\b/[email protected]/ 

abc [email protected] aaa 
abc [email protected] aaa 
+0

bardzo doceniane, złapałem]] miałem tam jednak trzymane z widokiem na drugą kropkę. Doprowadziło mnie to do szału ostatniej nocy. Dam mu wir i zobaczę, czy da mi to, czego szukałem. –

+0

To rozwiązanie wymaga naprawy po usunięciu notacji PCRE i przechwytywaniu opcjonalnym, a także dopasowaniu adresu "@ localhost". Jednak podczas działania poprawionego skryptu pokazuje on, że zastępuje elementy, gdy zrzuca conf do STDOUT, ale przy ponownym analizie za pomocą 'sed -rne '/ \ b [A-Za-z0-9 ._% -] + @ ([a-zA-Z0-9 -] (\.)?) + ([A-Za-z] {2,4})? \ b/p '/ etc/httpd/conf/httpd.conf' to pokazuje że nie wprowadzono żadnych zmian. –

+1

Czy chcesz dołączyć opcję -i (lub -i)? Tak, aby nadpisała oryginalny plik? (Przy założeniu, że masz GNU 'sed', oczywiście.) (Dla e-maili" localhost ", myślę, że potrzebujesz po prostu drugiego wyrażenia, na pewno będzie to łatwiejsze niż wrzucenie go do tego, którego już masz.) –

Powiązane problemy