2013-02-04 7 views
14

Ich möchte alle Steuerzeichen aus meiner Datei mit Linux Bash-Befehle löschen.Entfernen von Steuerzeichen aus einer Datei

Es gibt einige Steuerzeichen wie EOF (0x1A), die das Problem verursachen, wenn ich meine Datei in eine andere Software lade. Ich möchte das löschen. Hier

ist das, was ich bisher versucht:

diese alle Steuerzeichen auflistet:

cat -v -e -t file.txt | head -n 10 

^A+^X$ 
^A1^X$ 
^D ^_$ 
^E-^D$ 
^E-^S$ 
^E1^V$ 
^F%^_$ 
^F-^D$ 
^F.^_$ 
^F/^_$ 
^F4EZ$ 
^G%$ 

Diese listet alle Steuerzeichen mit grep:

$ cat file.txt | head -n 10 | grep '[[:cntrl:]]' 
+ 
1 

- 
- 
1 
% 
- 
. 
/

Streichhölzer die obige Ausgabe des Katzenkommandos.

Nun lief ich den folgenden Befehl, um alle Linien zu zeigen, keine Steuerzeichen enthalten, aber es ist immer noch die gleiche Ausgabe wie oben (Linien mit Steuerzeichen) zeigt

$ cat file.txt | head -n 10 | grep '[^[:cntrl:]]' 
+ 
1 

- 
- 
1 
% 
- 
. 
/

hier ist die Ausgabe im Hex-Format:

$ cat file.txt | head -n 10 | grep '[[:cntrl:]]' | od -t x2 
0000000 2b01 0a18 3101 0a18 2004 0a1f 2d05 0a04 
0000020 2d05 0a13 3105 0a16 2506 0a1f 2d06 0a04 
0000040 2e06 0a1f 2f06 0a1f 
0000050 

Wie Sie sehen können, sind die Hexadezimalwerte 0x01, 0x18 Steuerzeichen.

Ich versuchte, den Befehl tr mit den Steuerzeichen zu löschen, aber einen Fehler bekam:

$ cat file.txt | tr -d "\r\n" "[:cntrl:]" >> test.txt 
tr: extra operand `[:cntrl:]' 
Only one string may be given when deleting without squeezing repeats. 
Try `tr --help' for more information. 

Wenn ich alle Steuerzeichen löschen, ich werde auch das Newline und Carriage Return am Ende zu löschen, die als verwendet wird, die Newline-Zeichen in Windows. Wie lösche ich alle Steuerzeichen und behalte nur die benötigten Zeichen wie "\ r \ n"?

Danke.

+0

'grep' würde Zeilen der Ausgabe grep, außer Sie verwenden die' -o' Option. – devnull

Antwort

18

Statt den vordefinierten [:cntrl:] Satz zu verwenden, die, wie Sie beobachtet \n und \r enthält, nur Liste (in oktal) die Steuerzeichen Sie wollen loswerden:

$ tr -d '\000-\011\013\014\016-\037' <file.txt> newfile.txt 
1

Versuchen grep, wie:

, die nur alphanumerische Zeichen einschließlich Interpunktionszeichen und Leerzeichen wie Registerkarten, Zeilenumbrüche, vertikale Registerkarten, Seitenvorschub, Wagenrücklauf und Leerzeichen drucken.

Um weniger restriktiv, und entfernen Sie nur control characters ([:cntrl:]), löschen Sie sie durch:

tr -d "[:cntrl:]" 

Wenn Sie \n behalten wollen (die Teil von [:cntrl:] ist), dann ersetzen Sie es vorübergehend zu etwas anderem, z.B

cat file.txt | tr '\r\n' '\275\276' | tr -d "[:cntrl:]" | tr "\275\276" "\r\n" 
1

Basiert auf this answer auf Unix.Stack, sollte dies den Trick:

$ cat scriptfile.raw | col -b > scriptfile.clean 
+0

Mit Dank an Bruce Ediger https://unix.stackexchange.com/questions/15855/how-to-dump-a-man-page/15866#15866?newreg=4613fa4638aa4965ac10b183c10678df –

0

Ein wenig spät zur Party: cat -v <file> die ich denke, ist die einfachste der Partie zu erinnern!

Verwandte Themen