Làm cách nào để tìm kiếm và thay thế một tập hợp các tệp?


9

Tôi muốn xác định một tập hợp các tệp trong đó tôi có thể tìm kiếm và thay thế văn bản.

Làm rõ:

Tôi muốn có thể tìm kiếm, ví dụ: trong tất cả các tệp xk * .tex trong một thư mục nhất định (và không bao gồm các tệp sao lưu). Tôi cũng muốn có thể thay đổi biểu thức, ví dụ: "không chắc chắn", thành "không xác định" trong tất cả các tệp dd * .sh và ee * .cls.

Cách tiêu chuẩn để làm điều này là gì?


@Claudio Bạn có thể muốn xem diredđể thực hiện tìm và thay thế một tập hợp con các tệp trong một thư mục nhất định.
Mực 23/2/2015

Dưới đây là một ví dụ của việc "tìm kiếm / thay thế" trong nhiều file trong một thư mục / dự án sử dụng ag, wgrepmultiple-cursors.
Kaushal Modi

Câu trả lời:


4

Nếu bạn đang làm việc trên một dự án được xác định rõ, bạn có thể sử dụng occurgrepcác cơ sở trong dự án đó thông qua projectile. Nắm bắt từ mô tả github của nó, trong số các bit chức năng khác nhau được cung cấp bởi projectile, nó có thể làm:

  • thay thế trong dự án
  • đa xảy ra trong bộ đệm dự án
  • grep trong dự án
  • thăm dự án trong dired

4

Nếu tất cả các tệp nằm trong cùng một thư mục, bạn có thể làm theo các bước sau. Tôi sẽ căn cứ vào ví dụ thứ hai được đưa ra trong các ý kiến:

  1. M-xdiredđể mở thư mục liên quan trong diredchế độ.
  2. %mđể chạy dired-mark-files-regexptrong thư mục đó.
  3. Nhập ^dd.*\.sh$, đó là regex tương đương với dd*.sh. Các tệp đó bây giờ sẽ được đánh dấu bằng một *, và cũng có thể xuất hiện được tô sáng bằng một màu khác tùy thuộc vào bảng màu của bạn.
  4. Lặp lại bước # 3 nhiều lần nếu cần, với bất kỳ biểu thức chính nào bạn muốn (ví dụ ^ee.*\.cls$) cho đến khi tất cả các tệp bạn muốn chỉnh sửa được đánh dấu.
  5. Qđể chạy dired-do-query-replace-regexptrên các tập tin bạn đã đánh dấu.
  6. Nhập uncertaintyindeterminacylàm chuỗi truy vấn. (Tôi nghĩ rằng điều này sẽ phân biệt chữ hoa chữ thường. Nếu bạn cần nó không phân biệt chữ hoa chữ thường, điều đó có thể yêu cầu một biểu thức chính quy, nhưng tôi không chắc chắn.)

Và đó là ý tưởng. Nếu bạn cần lặp lại điều này một vài lần trong các thư mục khác nhau, bạn có thể ghi lại các bước 2-6 dưới dạng macro (nhấn C-x (sau bước # 1 và C-x )sau bước # 6). Và ngay cả khi bạn không thoải mái lắm với elisp, bạn có thể dịch macro đó thành elisp bằng cách sử dụng insert-kbd-macrovà cố gắng hack nó thành một chức năng hữu ích.


1
Xin lưu ý rằng trong Emacsland, S-qkhông có nghĩa shift+q, nó có nghĩa super+q. Bạn chỉ nên viết Qnếu bạn có ý nghĩa shift+q. Tôi đã chỉnh sửa bình luận của bạn để phản ánh điều này.
mẫu

2
Thật ra không, S-qkhông có nghĩa shift+q; super+qsẽ được viết s-q.
Sue D. Nymme 23/2/2015

3

Bạn có thể sử dụng M-x find-name-diredđể có được một bộ đệm được điều hướng có chứa các liên kết đến tất cả các tệp khớp với một mẫu tên đã cho.

Sử dụng M-x find-grep-diredđể có được một bộ đệm được điều hướng có chứa các tệp có nội dung khớp với mẫu grep được cung cấp.

Có nhiều lệnh như vậy hơn; cái nào phù hợp nhất phụ thuộc vào yêu cầu của bạn, vì vậy hãy xem xét cập nhật câu hỏi của bạn.

Sau đó, bạn có thể duyệt qua danh sách các tệp bằng cách sử dụng macro. Hãy xem câu trả lời của Brian để biết ví dụ: https://emacs.stackexchange.com/a/9497/2005


1

Sử dụng rgrep và wgrep.

Với rgrep, bạn có thể tìm kiếm tất cả các biểu thức chính quy trong các tệp có tên tệp khớp với biểu thức chính và bên trong một thư mục (và các thư mục con của nó)

với wgrep bạn có thể chỉnh sửa bộ đệm chứa kết quả tìm kiếm rgrep của bạn.

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.