LƯU Ý: Sử dụng sed
là cách thích hợp để thực hiện việc này, như được hiển thị bởi câu trả lời của @ Anthon !
Chỉ để cho bạn thấy làm thế nào bạn có thể làm điều này trong vim
. Bạn có thể sử dụng argdo
lệnh trong vim
. Từ :help argdo
trong vim
:
:argdo[!] {cmd} Execute {cmd} for each file in the argument list.
Thí dụ:
:args *.c
:argdo set ff=unix | update
Điều này đặt tùy chọn 'fileformat' thành "unix" và ghi tệp nếu nó đã được thay đổi. Điều này được thực hiện cho tất cả *.c
các tập tin.
Thí dụ:
:args *.[ch]
:argdo %s/\<my_foo\>/My_Foo/ge | update
Điều này thay đổi từ "my_foo" thành "My_Foo" trong tất cả *.c
và *.h
các tệp. Cờ "e" được sử dụng cho :substitute
lệnh để tránh lỗi cho các tệp trong đó "my_foo" không được sử dụng. :update
chỉ ghi tập tin nếu thay đổi được thực hiện.
Lệnh :args <pattern>
cho biết :argdo
tập tin nào bạn muốn chạy sau đây {cmd}
. Sau khi xác định bạn chạy :argdo {cmd} | update
nơi {cmd}
có thể là sự s/boy/Boy/g
thay thế của bạn .
Có phải tất cả các tập tin được mở trong hoạt động này?
Nó sẽ xuất hiện như vậy. Tôi đã làm các xét nghiệm sau đây để xác nhận điều này.
$ for i in {1..3};do echo "dog" > file${i}.txt;done
$ head file*.txt
==> file1.txt <==
dog
==> file2.txt <==
dog
==> file3.txt <==
dog
Bây giờ đi vào vim
và làm các lệnh sau:
:args file*.txt
Bạn có thể xác nhận rằng tất cả chúng đã được mở:
:ls
2 %a "file1.txt" line 1
3 "file2.txt" line 0
4 "file3.txt" line 0
Làm :argdo ...
:
:argdo %s/dog/cat/g | update
"file1.txt" 1L, 4C written
"file2.txt" 1L, 4C written
"file3.txt" 1L, 4C written
Vì vậy, hãy ghi nhớ điều này nếu bạn có ý định sử dụng phương pháp này. Nó không hiệu quả mở tất cả các tệp phù hợp với mẫu của bạn :args
và lần lượt áp dụng lệnh cho chúng.