2013-02-18 9 views
7

Io sono e sto lavorando su un file script sed e sto correndo in un errore di "espressione regolare precedente non valida" quando lo eseguo. Di seguito è il file nella sua interezza.Espressione regolare precedente non valida data da sed

Ho già fatto molte ricerche su questo, sia su questo sito che altrove. Molte domande poste qui hanno comportato la necessità di estendere le espressioni regolari a qualcosa che è stato sfuggito in modo errato. Ho definito questo come un'espressione estesa già come è necessario per la sostituzione di posta elettronica.

#!/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/ 

sto chiamando da termale come /etc/httpd/conf/httpd.conf ./config-apache.sed e ottenere questo restituito.

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

all'interno della linea di vim 12 è i dentified come il singolo } sopra #Enable user's Public HTML directories

risposta

13

Sembra GNU sed non piace il PCRE non cattura la notazione:

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

Prova:

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

GNU sed sembra t o sii OK con quello. Tuttavia, hai ancora un po 'di lavoro da fare. Data la prima riga sotto come ingresso, l'uscita è la seconda linea:

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

Ci sono due problemi che tale risultato:

  1. Il ]] dovrebbe essere un singolo ].
  2. Stai cercando un punto finale nella regex precedente, quindi non ne vuoi uno nell'ultima parte del suffisso del dominio.

Questo fa il lavoro:

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

molto apprezzato, ho colto l']] ho avuto in là, ma continuavo guardando oltre il secondo punto. Mi ha fatto impazzire la scorsa notte. Gli darò un vortice e vedrò se mi dà quello che stavo cercando. –

+0

Questa soluzione ha bisogno di lavoro dopo aver rimosso la notazione PCRE non-capturing e facendo la ricerca del punto opzionale così come ho bisogno di abbinare un indirizzo "@localhost". Tuttavia, quando esegue effettivamente lo script corretto mostra che sostituisce gli elementi quando esegue il dump del conf allo STDOUT ma quando ri-analizza con 'sed -rne '/ \ b [A-Za-z0-9 ._% -] + @ ([a-zA-Z0-9 -] (\.)?) + ([A-Za-z] {2,4})? \ b/p '/ etc/httpd/conf/httpd.conf' mostra che non sono state apportate modifiche. –

+1

Intendevi includere un'opzione '-i (o' -i.bak') in modo che sovrascriva il file originale? (Supponendo che tu abbia GNU 'sed', ovviamente.) (Per le email di" localhost ", penso che tu abbia semplicemente bisogno di una seconda regex, certamente, sarà più facile che forzarla in quella che hai già.) –

Problemi correlati