Dấu ngoặc đơn không được cân bằng mặc dù tôi đã thoát nó?


10

Tôi đang cố chạy sedlệnh đơn giản này

sed '/VALUES\ \([0-9]/d!'

Nó vẫn cho tôi một lỗi nói "RE error: parentheses not balanced"(vâng các trích dẫn ở đó).

Tôi có thể làm gì? Ý tôi là tôi chỉ có thể thêm cái khác )nhưng nó không khớp với regex của tôi.


Bạn có thể quên 's' trong 's / GIÁ TRỊ ...' không?
Minix

Không, tôi không tìm kiếm thay thế.
DisplayName

@Minix, anh ấy không cố gắng thay thế một chuỗi, sed còn làm được nhiều hơn thế. sed /<expression>/dxóa các dòng chứa <biểu thức>
Marcelo

@Marcelo Vâng. Nhìn thấy điều đó trong khi nhìn vào trang người đàn ông. Chỉ là một shot trong bóng tối. Có vẻ như tôi có một số tài liệu phụ.
Minix

@DisplayName Chỉ cần thêm -rtùy chọn vào lệnh sed của bạn và di chuyển !phía trước dlike sed -r '/VALUES\ \([0-9]/!d'để tránh điều đó.
αғsнιη

Câu trả lời:


13

Việc thoát (có ý nghĩa đặc biệt trong sed: nó được sử dụng cho các tài liệu tham khảo ngược . Để khớp với một nghĩa đen (, chỉ cần sử dụng nó mà không có dấu gạch chéo ngược:/VALUES ([0-9]/d!

Nếu bạn đang cố gắng khớp \(, \thay vào đó hãy thoát :\\(

Thoát khỏi (không gian) làm cho không có sự khác biệt.


5

Theo mặc định, sedsử dụng Biểu thức chính quy cơ bản (BRE) . Trong BRE \(\)được sử dụng để xác định biểu hiện phụ :

Một biểu hiện phụ có thể được xác định trong BRE bằng cách đặt nó giữa các cặp ký tự "(" và ")". Một biểu hiện phụ như vậy sẽ phù hợp với bất cứ điều gì nó phù hợp nếu không có "(" và ")", ngoại trừ việc neo trong các biểu hiện phụ là hành vi tùy chọn; xem biểu thức BRE neo. Subexpression có thể được lồng tùy ý.

Sau đó, bạn có thể sử dụng biểu thức tham chiếu ngược '\n'để khớp với chuỗi ký tự (có thể trống) giống như được khớp với một biểu thức con được bao quanh giữa \(\), ntừ đó đi 1qua 9. Tại đây, bạn chỉ sử dụng dấu ngoặc đơn bên trái \(, sedkhông thể tìm thấy dấu ngoặc đơn bên phải và đưa ra lỗi.

Trong BRE, bạn chỉ cần sử dụng (để khớp với dấu ngoặc trái.

Trong một số sedtriển khai, bạn có thể chuyển sang Biểu thức chính quy mở rộng (ERE) (ví dụ GNU sed với -ropstion), vì vậy bạn phải sử dụng \(để khớp với dấu ngoặc đơn bên trái.


0

Đây chính xác là lý do. Bạn không nên thoát dấu ngoặc trong trường hợp này.

Các trích dẫn đơn 'đã báo cho shell không bận tâm về nội dung chuỗi, vì vậy nó được truyền theo nghĩa đen cho sed. Thoát khỏi dấu ngoặc đơn là nói với sed để mong kết thúc \)là dấu phân cách cho biểu thức con.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.