Tôi đã xem xét câu hỏi này và sau đó tự hỏi làm thế nào tôi có thể thực hiện câu trả lời của mình
sed
bằng cách sử dụng hoàn toàn
POSIX
ex
.
Thủ thuật là trong khi sed
tôi có thể so sánh không gian giữ với không gian mẫu để xem chúng có chính xác tương đương (với
G;/^\(.*\)\n\1$/{do something}
) không, tôi biết không có cách nào để thực hiện thử nghiệm như vậy ex
.
Tôi biết rằng trong Vim tôi có thể Y
ANK dòng đầu tiên và sau đó gõ
:2,$g/<C-r>0/d
vào gần như làm những gì tôi đang xác định-nhưng nếu dòng đầu tiên chứa bất cứ điều gì nhưng văn bản chữ rất đơn giản này trở nên không chắc chắn thực sự, kể từ khi dòng đang được đổ vào như một
regex , không chỉ là một chuỗi để so sánh. (Và nếu dòng đầu tiên chứa dấu gạch chéo về phía trước, phần còn lại của dòng sẽ được hiểu là một lệnh!)
Vì vậy, nếu tôi muốn xóa tất cả các dòng trong myfile
đó giống hệt với dòng đầu tiên nhưng không xóa dòng đầu tiên thì làm sao tôi có thể làm điều đó bằng cách sử dụng ex
? Đối với vấn đề đó, làm thế nào tôi có thể làm điều đó bằng cách sử dụng vi
?
Có cách nào để xóa một dòng POSIX nếu nó khớp chính xác với dòng khác không?
Có lẽ một cái gì đó giống như cú pháp tưởng tượng này:
:2,$g/**lines equal to "0**/d
sed
như một bộ lọc từ bên trong ex
và chạy toàn bộ sed
câu trả lời của tôi trên toàn bộ bộ đệm ... tất nhiên sẽ hoạt động (và thực tế không giống như di động sed -i
).
<C-r>0
rất tốt. Tôi không chắc bạn có thể làm tốt hơn chỉ với các lệnh Ex vì bạn phải bảo vệ các ký tự đặc biệt. Nếu không có ràng buộc tuân thủ POSIX, tôi nghĩ rằng bạn sẽ sử dụng công tắc rất danh nghĩa \V
và sau đó bạn sẽ bảo vệ dấu gạch chéo ngược (vì nó giữ ý nghĩa đặc biệt của nó ngay cả với \V
) với escape()
hàm có đối số thứ 2 là một chuỗi chứa tất cả các ký tự bạn muốn thoát / bảo vệ .
:execute '2,$g/\V' . escape(getline(1), '\/') . '/d'
Hoặc bạn có thể sử dụng một ký tự khác cho dấu phân cách mẫu như dấu chấm phẩy. Trong trường hợp này, bạn sẽ không cần phải bảo vệ dấu gạch chéo về phía trước trong mẫu. Nó sẽ cung cấp một cái gì đó như::execute '2,$g;\V' . escape(getline(1), '\') . ';d'
sed
cũng rất tốt. Với Vim, bạn thường ủy thác một số nhiệm vụ đặc biệt cho các chương trình khác và sed
có lẽ là một ví dụ điển hình cho điều đó. Nhân tiện, bạn không phải chạy sed
trên toàn bộ bộ đệm. Nếu bạn muốn chạy nó chỉ trên một phần của bộ đệm, bạn có thể đưa ra một phạm vi. Ví dụ: nếu bạn chỉ muốn lọc các dòng trong khoảng từ 50 đến 100, bạn có thể nhập : :50,100!<your sed command>
.
:execute '2,$g/\V' . escape(getline(1), '\') . '/d'