2013-02-18 10 views
7

Tôi đang và đang làm việc trên tệp tập lệnh sed và tôi đang gặp lỗi "Biểu thức chính quy trước không chính xác" khi tôi chạy nó. Dưới đây là toàn bộ tệp.Biểu thức chính quy trước không hợp lệ do sed

Tôi đã thực hiện nhiều tìm kiếm về điều này, cả trên trang web này và ở nơi khác. Nhiều câu hỏi được yêu cầu ở đây đã dẫn đến việc cần phải mở rộng cụm từ thông dụng một cái gì đó đang được thoát không chính xác. Tôi đã xác định điều này như là một expresion mở rộng đã được như nó là cần thiết cho việc thay thế email.

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

Tôi gọi nó là từ termal là ./config-apache.sed /etc/httpd/conf/httpd.conf và nhận trả lại.

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

bên trong của dòng vim 12 là i dentified như đơn } trên #Enable user's Public HTML directories

Trả lời

13

Có vẻ GNU sed không thích PCRE phi chụp ký hiệu:

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

Hãy thử:

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

GNU sed dường như t o được với điều đó. Tuy nhiên, bạn vẫn còn một chút việc phải làm. Căn cứ vào dòng đầu tiên dưới đây như là đầu vào, đầu ra là dòng thứ hai:

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

Có hai vấn đề đưa ra kết quả rằng:

  1. Các ]] phải là một đơn ].
  2. Bạn đang tìm dấu chấm trong regex trước, vì vậy bạn không muốn một dấu chấm ở phần cuối của hậu tố tên miền.

này không được công việc:

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

nhiều đánh giá cao, tôi bắt được]] tôi đã ở đó nhưng vẫn giữ nhìn thẳng ra dấu chấm thứ hai. Nó đã khiến tôi điên loạn đêm qua. Tôi sẽ cung cấp cho nó một whirl và xem nếu nó cho tôi những gì tôi đang tìm kiếm. –

+0

Giải pháp này không hoạt động sau khi xóa ký hiệu không cần ký hiệu PCRE và thực hiện tìm kiếm dấu chấm tùy chọn cũng như tôi cần khớp với địa chỉ "@localhost". Tuy nhiên khi thực sự chạy kịch bản đã sửa, nó cho thấy rằng nó thay thế các mục khi nó kết xuất conf thành STDOUT nhưng khi phân tích cú pháp lại với 'sed-rne '/ \ b [A-Za-z0-9 ._% -] + @ ([a-zA-Z0-9 -] (\.)?) + ([A-Za-z] {2,4})? \ b/p '/ etc/httpd/conf/httpd.conf' nó hiển thị không có thay đổi nào được thực hiện. –

+1

Ý của bạn là bao gồm tùy chọn '-i (hoặc' -i.bak') để nó ghi đè tệp gốc? (Đó là giả sử bạn có GNU 'sed', tất nhiên.) (Đối với 'localhost' email, tôi nghĩ bạn chỉ cần một regex thứ hai; chắc chắn, điều đó sẽ dễ dàng hơn việc ép nó vào cái bạn đã có.) –