Với tiêu chuẩn sed
, bạn sẽ không bao giờ thấy một dòng mới trong văn bản được đọc từ một tập tin. Điều này là do sed
đọc từng dòng và do đó không có dòng mới ở cuối văn bản của dòng hiện tại trong sed
không gian mẫu của. Nói cách khác, sed
đọc dữ liệu được phân định bằng dòng mới và các dấu phân cách không phải là một phần của những gì sed
tập lệnh nhìn thấy.
Các biểu thức thông thường có thể được neo ở cuối dòng bằng cách sử dụng $
(hoặc ở đầu, sử dụng ^
). Việc neo một biểu thức ở đầu / cuối của một dòng buộc nó phải khớp chính xác ở đó, và không chỉ bất kỳ nơi nào trên dòng.
Nếu bạn muốn thay thế bất cứ thứ gì khớp với mẫu [A-Za-z]*
ở cuối dòng bằng thứ gì đó, thì hãy neo mẫu đó như sau:
[A-Za-z]*$
... sẽ buộc nó khớp ở cuối dòng và không ở đâu khác.
Tuy nhiên, vì [A-Za-z]*$
cũng không khớp với gì (ví dụ: chuỗi trống có ở cuối mỗi dòng), bạn cần buộc khớp một thứ gì đó , ví dụ bằng cách chỉ định
[A-Za-z][A-Za-z]*$
Vì vậy, dòng lệnh sed của bạn sẽ như vậy
$ sed 's/[A-Za-z][A-Za-z]*$/replace/' file.txt
Tôi không sử dụng công -E
tắc ở đây vì không cần thiết. Với nó, bạn có thể đã viết
$ sed -E 's/[A-Za-z]+$/replace/' file.txt
Đó là một vấn đề của hương vị.
+
: bạn CÓ THỂ sử dụng nó ngay cả khi không sử dụng regex mở rộng, chỉ cần nhớ viết nó như thế nào\+
. Vì vậy,sed -e 's/[A-Za-z]\+$/replace/' file.txt
sẽ hoạt động hoàn hảo ngay cả khi khôngsed
cài đặt GNU . Và không được quên: Không sử dụng-E
, vì GNUsed
không hỗ trợ nó .