2013-02-18 2 views
7

Я работаю над файлом файла sed, и я запускаю его при ошибке «Недопустимое предшествующее регулярное выражение» при его запуске. Ниже находится файл целиком.Недопустимое предыдущее регулярное выражение, заданное sed

Я уже много сделал для этого, как на этом сайте, так и в другом месте. Многие вопросы, заданные здесь, привели к необходимости либо расширять регулярные выражения, либо что-то ускользало неправильно. Я определил это как расширенное выражение, которое уже необходимо для замены электронной почты.

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

Я зову его из термических как ./config-apache.sed /etc/httpd/conf/httpd.conf и получить это возвращается.

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

внутри VIM линии 12, я dentified в качестве единственного } выше #Enable user's Public HTML directories

ответ

13

Похоже GNU sed не нравится PCRE не-захватывая обозначения:

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

Try:

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

GNU sed похоже t o В порядке с этим. Однако у вас все еще есть небольшая работа. Принимая во внимании первую строку ниже в качестве входных данных, выход во второй строке:

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

Существует две проблем, дающих тот результат:

  1. ]] должен быть один ].
  2. Вы ищете конечную точку в предыдущем регулярном выражении, поэтому вы не хотите ее в последней части суффикса домена.

Это делает работу:

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

высоко ценится, я поймал]] я был там, но продолжал с видом на вторую точку. Вчера вечером я сбил меня с ума. Я дам ему вихрь и посмотрю, дает ли он мне то, что я искал. –

+0

Это решение действительно нуждается в работе после удаления ненавязчивой нотации PCRE, а также для поиска точки необязательно, а также для соответствия «@localhost». Однако при фактическом запуске исправленного скрипта он показывает, что он заменяет элементы, когда он выгружает conf в STDOUT, но при повторном анализе с помощью 'sed -rne '/ \ b [A-Za-z0-9 ._% -] + @ ([a-zA-Z0-9 -] (\.)?) + ([A-Za-z] {2,4})? \ b/p '/ etc/httpd/conf/httpd.conf' он показывает что никаких изменений не было. –

+1

Вы имели в виду опцию '-i (или' -i.bak'), чтобы перезаписать исходный файл? (Предполагается, что у вас есть GNU 'sed', конечно.) (Для электронных писем localhost я думаю, что вам просто нужно второе регулярное выражение, конечно, это будет проще, чем заставить его в тот, который у вас уже есть.) –

Смежные вопросы