làm cho `xóa-trùng lặp-dòng` bỏ qua các dòng trống và một số từ nhất định


9

Tôi đang chỉnh sửa một văn bản ở chế độ org, một số dòng được lặp lại vì chúng là một phần của các tệp khác nhau trong cùng một chủ đề.

Tôi muốn sử dụng delete-duplicate-linesđể xóa các dòng lặp lại, tuy nhiên, lệnh cũng loại bỏ các dòng trống, đó là điều tôi không muốn (nếu không tôi sẽ không có đoạn văn!). Tôi muốn bỏ qua một số từ nhất định tồn tại một mình trong các dòng, ví dụ: "Tiếp tục lại" , nó được lặp lại rất nhiều lần trong văn bản, nhưng tôi muốn giữ từ đó là bắt buộc.

Câu trả lời:


5

Bỏ qua các dòng trống

Bạn có thể nói delete-duplicate-linesbỏ qua các dòng trống bằng cách gọi qua

C-u C-u C-u M-x delete-duplicate-lines RET

Nếu bạn không muốn phải đánh C-unó nhiều lần khi bạn gọi delete-duplicate-lines, bạn có thể gói nó trong một lệnh tùy chỉnh và liên kết lệnh đó với một chuỗi khóa bạn chọn:

(defun delete-duplicate-lines-keep-blanks ()
  (interactive)
  (delete-duplicate-lines (region-beginning) (region-end) nil nil t))

(global-set-key (kbd "C-c d") 'delete-duplicate-lines-keep-blanks)

Bỏ qua các dòng khớp với biểu thức chính

Đối với phần thứ hai của câu hỏi của bạn, tôi không nghĩ bạn có thể đạt được những gì bạn muốn bằng phiên bản tích hợp sẵn delete-duplicate-lines. Tuy nhiên, bạn có thể sử dụng một phiên bản sửa đổi của lệnh (cũng giữ các dòng trống theo mặc định):

(defun delete-duplicate-lines
    (beg end keep &optional reverse adjacent keep-blanks interactive)
  (interactive
   (progn
     (barf-if-buffer-read-only)
     (list (region-beginning) (region-end)
           (read-string "Keep lines matching regexp: ") ; Prompt for regexp to keep
           (equal current-prefix-arg '(4))
           (equal current-prefix-arg '(16))
           t                                            ; Keep blanks by default
           t)))
  (let ((lines (unless adjacent (make-hash-table :test 'equal)))
        line prev-line
        (count 0)
        (beg (copy-marker beg))
        (end (copy-marker end)))
    (save-excursion
      (goto-char (if reverse end beg))
      (if (and reverse (bolp)) (forward-char -1))
      (while (if reverse
             (and (> (point) beg) (not (bobp)))
               (and (< (point) end) (not (eobp))))
        (setq line (buffer-substring-no-properties
                (line-beginning-position) (line-end-position)))
        (if (or (and keep-blanks (string= "" line))
                (string-match keep line))               ; Ignore line if it
                                                        ; matches regexp to keep
            (forward-line 1)
          (if (if adjacent (equal line prev-line) (gethash line lines))
              (progn
                (delete-region (progn (forward-line 0) (point))
                               (progn (forward-line 1) (point)))
                (if reverse (forward-line -1))
                (setq count (1+ count)))
            (if adjacent (setq prev-line line) (puthash line t lines))
            (forward-line (if reverse -1 1))))))
    (set-marker beg nil)
    (set-marker end nil)
    (when interactive
      (message "Deleted %d %sduplicate line%s%s"
               count
               (if adjacent "adjacent " "")
               (if (= count 1) "" "s")
               (if reverse " backward" "")))
    count))

Phiên bản delete-duplicate-linesnày sẽ nhắc bạn về một biểu thức chính quy và giữ tất cả các dòng khớp với biểu thức chính. Ví dụ: để giữ tất cả các dòng bao gồm từ Resumebạn sẽ làm:

M-x delete-duplicate-lines RET ^Resume$ RET

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.