2011-10-07 30 views
7

Tôi có tệp txt có tên COPYING được chỉnh sửa trên cửa sổ. Nó chứa cửa sổ phong cách eolCách tìm và loại bỏ các ký tự vô hình trong tệp văn bản bằng cách sử dụng emacs

$ file COPYING 
COPYING: ASCII English text, with CRLF line terminators 

Tôi đã cố gắng chuyển đổi nó thành kiểu unix bằng dos2unix. Bên dưới là đầu ra

$ dos2unix COPYING 
dos2unix: Skipping binary file COPYING 

Tôi rất ngạc nhiên khi thấy rằng chương trình dos2unix báo cáo là tệp nhị phân. Sau đó, sử dụng một số trình soạn thảo khác (không emacs) tôi thấy rằng các tập tin có chứa một nhân vật điều khiển. Tôi quan tâm để tìm tất cả các ký tự vô hình trong tập tin bằng cách sử dụng emacs.

By Googling tôi đã tìm thấy các giải pháp sau đó sử dụng tr

tr -cd '\11\12\40-\176' < file_name 

Làm thế nào để làm điều tương tự trong emacs cách. Tôi đã thử chế độ hexl. Chế độ hexl hiển thị văn bản và các giá trị ascii tương ứng của chúng trong một bộ đệm duy nhất rất tuyệt vời. Cách tìm các ký tự có giá trị ASCII khác với 11-12, 40-176 (nghĩa là tab, dấu cách và ký tự hiển thị). Tôi đã cố tạo một biểu thức chính quy cho tìm kiếm đó, nhưng nó khá phức tạp.

Trả lời

2

Emacs sẽ không ẩn bất kỳ ký tự nào theo mặc định. Nhấn Ctrl + Meta + %, hoặc Esc sau đó Ctrl +% nếu trước đây là quá khắt khe với ngón tay của bạn, hoặc M-x replace-regexp RET nếu bạn thích. Sau đó, đối với các biểu thức chính quy, nhập

[^@-^H^K-^_^?] 

Tuy nhiên, khi tôi đã viết ^H, gõ Ctrl + Q sau đó Ctrl + H, nhập “control-H” nhân vật theo nghĩa đen, và tương tự cho những người khác.Bạn có thể nhấn tổ hợp phím Ctrl + Q sau đó Ctrl +Space cho ^@, và thường Ctrl +Q sau đó Backspace cho ^?. Thay thế tất cả các lần xuất hiện của cụm từ thông dụng này bằng chuỗi rỗng.

Vì bạn có tệp mở trong Emacs, bạn có thể thay đổi kết thúc dòng trong khi bạn đang ở đó. Nhấn C-x RET f (Ctrl +XReturnF) và nhập us-ascii-unix như mã hóa mới mong muốn cho tập tin.

+0

Cảm ơn câu trả lời. Tôi muốn hiểu những gì biểu thức chính quy. Tôi đã gõ lệnh "description-character-set" rồi chọn "ascii" để xem bộ ký tự. Bạn có thể giải thích tại sao bạn bỏ lỡ C-j và ở đâu C-? được ghi lại. –

+0

@Talespin_Kit 'C-i' là tab,' C-j' là dòng mới. – Gilles

+0

Liên kết này http://www2.lib.uchicago.edu/keith/tcl-course/emacs-tutorial.html nói rằng C-m là dành cho khóa RET. Tôi không thể tìm thấy tài liệu ở đâu C-? được ghi lại. Bạn có thể vui lòng chỉ nó ra. –

0

Khám phá M-x set-buffer-file-coding-system. Từ các tài liệu:

(set-buffer-file-coding-system CODING-SYSTEM &optional FORCE NOMODIFY)

Đặt các tập tin mã hóa hệ thống của bộ đệm hiện tại để MÃ HÓA-SYSTEM. Điều này có nghĩa là khi bạn lưu bộ đệm, nó sẽ được chuyển đổi theo CODING-SYSTEM. Để biết danh sách các giá trị có thể có của CODING-SYSTEM, hãy sử dụng các hệ thống mã hóa danh sách M-x.

Vì vậy, hãy chuyển từ DOS sang UNIX, M-x set-buffer-file-coding-system unix.

10

Để xem các ký tự ẩn, bạn có thể thử whitespace-mode. Dấu cách và tab sẽ được hiển thị với biểu tượng ở một khuôn mặt khác. Nếu hệ thống mã hóa tự động được phát hiện là dos (hiển thị (DOS) trên thanh trạng thái), thì dấu xuống dòng ở cuối dòng cũng sẽ bị ẩn. Chạy revert-buffer-with-coding-system để chuyển đổi sang Unix hoặc nhị phân (ví dụ: C-x RET r unix) và chúng sẽ luôn hiển thị là ^M. Hệ thống mã hóa nhị phân sẽ hiển thị bất kỳ ký tự không phải ASCII nào làm ký tự điều khiển.

+0

Tất cả các ký tự không hiển thị dưới dạng^M. Tôi có một tập tin rất lớn, tôi có thể thấy một số ký tự là^L. Tôi không biết có bao nhiêu ký tự như vậy trong tập tin. Tôi muốn tìm kiếm những nhân vật đó. –

+0

Chế độ meta-x khoảng trắng là cách bạn mở khóa lệnh này. – DragonLord

Các vấn đề liên quan