Nghĩa thay thế dấu gạch chéo (/) bằng dấu chấm than (!) Trong lệnh thay thế là gì?


13

Gần đây tôi đã thấy một lệnh thay thế trong đó tác giả đã /thay thế bằng một !như thế này::s!abc!ABC!g

Tôi đã cố gắng tìm một số tài liệu về việc sử dụng này nhưng tôi không thể tìm thấy bất cứ điều gì có liên quan. Vì vậy, tôi đã cố gắng tự mình thử nghiệm và một lần nữa tôi không thể tìm ra sự khác biệt thực sự giữa hai dấu hiệu. Đây là những gì tôi tìm thấy:

  • Không thể trộn !/trong một lệnh. Ví dụ :s!abc/ABCthất bại.
  • Nó có thể hữu ích để sử dụng !để tránh thoát khỏi /một mẫu. Ví dụ nếu tôi muốn thay thế </bằng %tôi có thể sử dụng :%s!</!%!gthay thế :%s/<\//%/g.
  • Có vẻ như trong một số trường hợp, một số regex sẽ không hoạt động /và hoạt động đúng với !nhưng vì tôi không thực sự là một chuyên gia về regex nên tôi không chắc về điều đó.

Vì vậy, câu hỏi của tôi rất đơn giản: lợi thế của việc sử dụng !trong lệnh thay thế là gì và khi nào tôi nên quyết định sử dụng nó thay vì /?



Quả thực tôi đã viết một bài kép do nhầm lẫn, tôi đã đánh dấu nó vài phút trước để biết tôi nên làm gì.
statox

Câu trả lời:


22

Từ :help :global:

Thay vì '/' bao quanh {pattern}, bạn có thể sử dụng bất kỳ ký tự byte đơn nào khác, nhưng không phải là ký tự chữ cái, '\', '"' hoặc '|'. Điều này hữu ích nếu bạn muốn đưa '/' vào mẫu tìm kiếm hoặc chuỗi thay thế.

Như bạn đã nghĩ ra từ thử nghiệm của mình, điều này là để ngăn chặn cái gọi là " hội chứng tăm nghiêng ". Xem xét điều này:

:%s/\/home\/martin\/test/\/home\/jake\/x/

đấu với:

:%s!/home/martin/test!/home/jake/x!

Hình thức thứ hai rõ ràng là dễ đọc hơn rất nhiều.

Đây là lý do duy nhất bạn có thể thay đổi dấu phân cách; để làm cho nó dễ đọc hơn cho con người chúng ta. Máy tính không quan tâm.

Một số chương trình khác thậm chí còn linh hoạt hơn, trong GNU, sedví dụ, bạn có thể sử dụng xlàm dấu phân cách nếu muốn. sed sxaxbxg filecũng giống như sed s/a/b/g file.


Về tính dễ đọc, tôi thích (và gợi ý) :%s@/home/martin/test@/home/jake/x@, vì "chất béo" @giúp dễ dàng hơn để xem các phần riêng lẻ của câu lệnh bắt đầu / kết thúc ở đâu.
DevSolar

@DevSolar Tôi thấy :%s#/home/martin/test#/home/jake/x#công việc thậm chí còn tốt hơn, nhưng đó chỉ là ý kiến ​​cá nhân.
Vàng Amit
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.