2012-08-29 25 views
29

Đây là những gì tôi đang làm (ví dụ đơn giản):Có gì sai với regex lookahead của tôi trong GNU sed?

gsed -i -E 's/^(?!foo)(.*)$/bar\1/' file.txt 

Tôi đang cố gắng để đưa bar trước mỗi dòng mà không bắt đầu bằng foo. Đây là lỗi:

gsed: -e expression #1, char 22: Invalid preceding regular expression 

Có vấn đề gì?

+0

có thể trùng lặp của http://stackoverflow.com/questions/2086450/pcre-regex-to-sed-regex – hostmaster

+1

vui lòng cập nhật câu trả lời đã chọn nếu có thể. [This] (http://stackoverflow.com/a/12178023/131120) cho thấy rằng nó thực sự có thể đạt được cùng với sed. – erikbwork

Trả lời

36

Theo như tôi biết sed không phải là không nhìn về phía trước cũng như không nhìn phía sau. Chuyển sang ngôn ngữ mạnh hơn với cú pháp tương tự, như perl.

+14

Một chuyển đổi đơn giản 'sed' thành' perl' để tham khảo: 'sed 's/before/after/g'/my/file' =>' cat/my/file | perl -ne 's/trước/sau/g; in; '' – Batandwa

+4

@Batandwa http://www.smallo.ruhr.de/award.html – ceving

+7

@Batandwa Việc sử dụng mèo và đường ống vào perl là không cần thiết. Chỉ cần sử dụng 'perl -pi -e' s/before/after/g '/ my/file'. – ypid

6

Bạn sử dụng cú pháp biểu thức chính quy tương thích (PCRE) perl không được GNU sed hỗ trợ. Bạn nên viết lại regex của mình theo SED Regular-Expressions hoặc sử dụng perl thay thế.

83
sed -i '/^foo/! s/^/bar/' file.txt 
  • -i => thay đổi các tập tin ở vị trí
  • /^foo/! => chỉ thực hiện các hành động tiếp theo trên dây chuyền không (!) bắt đầu với foo (^foo)
  • s/^/bar/ => thay đổi khi bắt đầu dòng để thanh  
+3

Giải pháp rất đẹp. Không cần phải theo dõi lại. Chỉ cần sử dụng chức năng mà sed đã có. –

+7

Điều này là tốt cho một biểu thức neo như '^ foo', nhưng tiếc là không mở rộng đến trường hợp chung của lookahead tiêu cực bất cứ nơi nào trong một mẫu. – tripleee