2011-10-07 17 views
7

Mam plik txt o nazwie COPYING, który jest edytowany w systemie Windows. Zawiera styl okna eolJak znaleźć i usunąć niewidoczne znaki w pliku tekstowym za pomocą emacsa

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

Próbowałem przekonwertować go do stylu unix przy użyciu dos2unix. Poniżej znajduje się wyjście

Zaskoczyło mnie, że program dos2unix zgłasza go jako plik binarny. Następnie za pomocą innego edytora (nie emacs) stwierdziłem, że plik zawiera znak kontrolny. Jestem zainteresowany, aby znaleźć wszystkie niewidoczne znaki w pliku za pomocą emacs.

Przez Googling znalazłem następujące rozwiązanie, które wykorzystuje tr

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

Jak zrobić to samo w emacs sposób. Wypróbowałem tryb hexl. Tryb hexl pokazuje tekst i odpowiadające im wartości ASCII w pojedynczym buforze, który jest świetny. Jak znaleźć znaki, które mają wartości ASCII inne niż 11-12, 40-176 (tj. Tabulacja, spacja i widoczne znaki). Próbowałem utworzyć wyrażenie regularne dla tego wyszukiwania, ale jest dość skomplikowane.

Odpowiedz

2

Emacs nie ukryje domyślnie żadnego znaku. Prasa Ctrl + Meta + % lub Esc następnie Ctrl + % jeśli były to zbyt mocno palcami lub M-x replace-regexp RET jeśli wolisz. Następnie, dla wyrażenia regularnego, wprowadź

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

Jednakże gdy pisałem ^H typu Ctrl + Q następnie Ctrl + H, aby wprowadzić znak „Control-H” dosłownie, i podobnie dla innych.Można nacisnąć Ctrl + Q następnie Ctrl + Kosmiczne dla ^@ i zazwyczaj Ctrl + Q następnie Backspace dla ^?. Zastąp wszystkie wystąpienia tego wyrażenia regularnego pustym ciągiem.

Ponieważ plik jest otwarty w Emacs, możesz zmienić jego zakończenia linii, gdy jesteś na tym. Prasa C-x RET f (Ctrl + XpowrotuF) i wprowadzić us-ascii-unix jako nowego pożądanego kodowania pliku.

+0

Dzięki za odpowiedź. Chciałem zrozumieć, co robi wyrażenie regularne. Wprowadziłem polecenie "opis-zestaw znaków", a następnie zaznacz "ascii", aby zobaczyć zestaw znaków. Czy mógłbyś wyjaśnić, dlaczego przegapiłeś C-j i gdzie C-? jest udokumentowane. –

+0

@Talespin_Kit 'C-i' to tabulacja,' C-j' to znak nowej linii. – Gilles

+0

Ten link http://www2.lib.uchicago.edu/keith/tcl-course/emacs-tutorial.html mówi, że C-m jest dla klucza RET. Nie mogę znaleźć dokumentu gdzie C-? jest udokumentowane. Czy możesz to wskazać. –

0

Zapoznaj się z M-x set-buffer-file-coding-system. Z dokumentacji:

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

ustawić plik coding-system bieżącego bufora do systemu kodowania. Oznacza to, że po zapisaniu bufora zostanie przekonwertowany według KODOWANIA SYSTEMU. Aby uzyskać listę możliwych wartości KODOWANIE-SYSTEM, użyj systemów kodowania list M-x.

Tak, przechodząc od DOS do UNIX, M-x set-buffer-file-coding-system unix.

10

Aby zobaczyć niewidoczne znaki, możesz spróbować whitespace-mode. Spacje i zakładki będą wyświetlane z symbolem w innej twarzy. Jeśli system kodowania zostanie automatycznie wykryty jako dos (wyświetlający (DOS) na pasku stanu), powrót karetki na końcu linii również zostanie ukryty. Uruchom revert-buffer-with-coding-system, aby przełączyć go na Unix lub binarny (np. C-x RET r unix) i zawsze będą wyświetlane jako ^M. Binarny system kodowania będzie wyświetlał również znaki spoza ASCII jako znaki kontrolne.

+0

Wszystkie postacie nie pojawiają się jako^M. Mam bardzo duży plik, widzę niektóre postacie jako^L. Nie wiem, ile takich postaci znajduje się w pliku. Chcę wyszukać te postacie. –

+0

Meta-x tryb białych znaków to sposób odblokowania tego polecenia. – DragonLord

Powiązane problemy