Bài viết này mô tả cách tìm và thay thế văn bản trong Vim / Vi.
Vim là trình soạn thảo văn bản dòng lệnh phổ biến nhất. Nó được cài đặt sẵn trên macOS và hầu hết các bản phân phối Linux. Tìm và thay thế văn bản trong Vim rất nhanh chóng và dễ dàng.
Tìm và thay thế cơ bản
Trong Vim, bạn có thể tìm và thay thế văn bản bằng lệnh :substitute( :s).
Để chạy các lệnh trong Vim, bạn phải ở chế độ bình thường, chế độ mặc định khi khởi động trình soạn thảo. Để quay lại chế độ bình thường từ bất kỳ chế độ nào khác, chỉ cần nhấn phím ‘Esc’.
Hình thức chung của lệnh thay thế như sau:
:[range]s/{pattern}/{string}/[flags] [count]
Lệnh này sẽ tìm kiếm từng dòng [range]để tìm a {pattern}và thay thế nó bằng a {string}. [count]là một số nguyên dương nhân lệnh.
Nếu không [range]và [count]được đưa ra, chỉ mẫu được tìm thấy trong dòng hiện tại được thay thế. Dòng hiện tại là dòng đặt con trỏ.
Ví dụ: để tìm kiếm sự xuất hiện đầu tiên của chuỗi ‘foo’ trong dòng hiện tại và thay thế nó bằng ‘bar’, bạn sẽ sử dụng:
:s/foo/bar/
Để thay thế tất cả các lần xuất hiện của mẫu tìm kiếm trong dòng hiện tại, hãy thêm g:
:s/foo/bar/g
Nếu bạn muốn tìm kiếm và thay thế mẫu trong toàn bộ tệp, hãy sử dụng ký tự phần trăm % làm phạm vi. Ký tự này chỉ ra một phạm vi từ dòng đầu tiên đến dòng cuối cùng của tệp:
:%s/foo/bar/g
Nếu {string} phần bị bỏ qua, phần đó được coi là chuỗi trống và mẫu phù hợp sẽ bị xóa. Lệnh sau sẽ xóa tất cả các phiên bản của chuỗi ‘foo’ trong dòng hiện tại:
:s/foo//g
Thay vì ký tự gạch chéo (/), bạn có thể sử dụng bất kỳ ký tự byte đơn không phải chữ và số nào khác ngoại trừ ký tự phân cách. Tùy chọn này hữu ích khi bạn có ký tự ‘/’ trong mẫu tìm kiếm hoặc chuỗi thay thế.
:s|foo|bar|
Để xác nhận từng thay thế, hãy sử dụng c:
:s/foo/bar/gc
replace with bar (y/n/a/q/l/^E/^Y)?
Nhấn y để thay thế trận đấu hoặc l để thay thế trận đấu và thoát. Nhấn n để bỏ qua trận đấu và q hoặc Esc để bỏ thay thế. Tùy chọn a thay thế các Match và tất cả các lần xuất hiện còn lại của Match. Để cuộn màn hình xuống, hãy sử dụng CTRL+Y và để cuộn lên, hãy sử dụng CTRL+E.
Bạn cũng có thể sử dụng biểu thức chính quy làm mẫu tìm kiếm. Lệnh dưới đây thay thế tất cả các dòng bắt đầu bằng ‘foo’ bằng ‘Vim is the best’:
:%s/^foo.*/Vim is the best/gc
Biểu tượng ^(caret) match với đầu dòng và .* match với bất kỳ số lượng bất kỳ ký tự.
Phân biệt chữ hoa chữ thường
Theo mặc định, thao tác tìm kiếm có phân biệt chữ hoa chữ thường; tìm kiếm “FOO” sẽ không khớp với “Foo”.
Để bỏ qua chữ hoa chữ thường cho mẫu tìm kiếm, hãy sử dụng i:
:s/Foo/bar/gi
Một cách khác để buộc bỏ qua trường hợp là thêm \cvào sau mẫu tìm kiếm. Ví dụ: /Linux\c thực hiện tìm kiếm chữ hoa chữ thường bỏ qua.
Nếu bạn đã thay đổi cài đặt viết hoa mặc định và bạn muốn thực hiện tìm kiếm phân biệt chữ hoa chữ thường, hãy sử dụng I:
:s/foo/bar/gi
Chữ hoa \C sau mẫu cũng buộc tìm kiếm so khớp chữ hoa chữ thường.
Phạm vi tìm kiếm
Khi không có phạm vi nào được chỉ định, lệnh thay thế chỉ hoạt động trong dòng hiện tại.
Phạm vi có thể là một dòng hoặc khoảng giữa hai dòng. Các chỉ định dòng được phân tách bằng ký tự , hoặc ;. Phạm vi có thể được chỉ định bằng cách sử dụng số dòng tuyệt đối hoặc các ký hiệu đặc biệt.
Ví dụ: để thay thế tất cả các lần xuất hiện của ‘foo’ thành ‘bar’ trong tất cả các dòng bắt đầu từ dòng 3 đến dòng 10, bạn sẽ sử dụng:
:3,10s/foo/bar/g
Phạm vi được bao gồm, có nghĩa là dòng đầu tiên và dòng cuối cùng được bao gồm trong phạm vi.
Ký .tự dấu chấm cho biết dòng hiện tại và $ – ký hiệu đô la ở dòng cuối cùng. Để thay thế ‘foo’ trong tất cả các dòng bắt đầu từ dòng hiện tại đến dòng cuối cùng:
:.,$s/foo/bar/
Mã định danh dòng cũng có thể được đặt bằng cách sử dụng ký hiệu ‘+’ hoặc ‘-‘, theo sau là một số được cộng hoặc trừ từ số dòng trước đó. Nếu số sau ký hiệu bị bỏ qua, nó sẽ mặc định là 1.
Ví dụ: để thay thế mỗi ‘foo’ bằng ‘bar’ bắt đầu từ dòng hiện tại và bốn dòng tiếp theo, hãy nhập:
:.,+4s/foo/bar/g
Thay thế toàn bộ từ
Lệnh thay thế tìm kiếm mẫu dưới dạng một chuỗi, không phải toàn bộ từ. Ví dụ: nếu bạn đang tìm kiếm “gnu”, thì tìm kiếm sẽ khớp với “gnu” được nhúng trong các từ lớn hơn, chẳng hạn như “cygnus” hoặc “magnum”.
Để tìm kiếm toàn bộ từ, hãy nhập \< để đánh dấu phần đầu của một từ, nhập mẫu tìm kiếm, nhập \> để đánh dấu phần cuối của một từ:
Ví dụ: để tìm kiếm từ “foo”, bạn sẽ sử dụng \<foo\>:
:s/\<foo\>/bar/
Lịch sử thay thế
Vim theo dõi tất cả các lệnh bạn chạy trong phiên hiện tại. Để duyệt lịch sử cho các lệnh thay thế trước đó, hãy nhập :s và sử dụng các phím mũi tên lên / xuống để tìm thao tác thay thế trước đó. Để chạy lệnh, chỉ cần nhấn Enter. Bạn cũng có thể chỉnh sửa lệnh trước khi thực hiện thao tác.
Ví dụ
Các dòng chú thích (thêm vào trước dòng # ) từ 5 đến 20:
:5,20s/^/#/
Các dòng bỏ ghi chú từ 5 đến 20, hoàn nguyên các thay đổi trước đó:
:5,20s/^#//
Thay thế tất cả các trường hợp ‘apple’, ‘orange’ và ‘mango’ bằng ‘fruit’:
:%s/apple\|orange\|mango/fruit/g
Xóa khoảng trắng ở cuối mỗi dòng:
:%s/\s\+$//e
Phần kết luận
Tìm kiếm và thay thế là một tính năng mạnh mẽ của Vim, cho phép bạn thực hiện các thay đổi đối với văn bản của mình một cách nhanh chóng.
Hãy để lại bình luận nếu bạn có bất kỳ câu hỏi nào.