2013-02-04 119 views
14

我想使用linux bash命令從我的文件中刪除所有控制字符。從文件中刪除控制字符

有一些控制字符,如EOF(0x1A),尤其是當我在另一個軟件中加載我的文件時導致問題。我想刪除這個。

這裏是我到目前爲止已經試過:

這將列出所有的控制字符:

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

- 
- 
1 
% 
- 
. 
/

比賽:

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%$ 

這將用grep列出所有的控制字符以上輸出的cat命令。現在

,我跑的以下命令以顯示不包含控制字符的所有行,但它仍然是示出了相同的輸出如上(與控制字符線)

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

- 
- 
1 
% 
- 
. 
/

這裏是十六進制格式的輸出:

$ 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 

正如您所見,十六進制值0x01,0x18是控制字符。

我嘗試使用tr命令來刪除控制字符,但得到了一個錯誤:

$ 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. 

如果我刪除了所有的控制字符,我最終會刪除換行符並回車,以及被用作窗口上的換行符。如何刪除所有控制字符,只保留「\ r \ n」之類的字符?

謝謝。

+0

'grep'會grep輸出行,除非你使用'-o'選項。 – devnull

回答

18

而不是使用預定義[:cntrl:]集,你觀察到的包括\n\r,只是名單(八進制)你想控制字符的擺脫:

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

嘗試grep,如:

grep -o "[[:print:][:space:]]*" in.txt > out.txt 

它將只打印包括標點字符和空格字符(如製表符,換行符,垂直製表符,換頁符,回車符和空格)的字母數字字符。

要限制較少,並且只刪除control characters[:cntrl:]),通過刪除它們:如果你想保持\n(這是[:cntrl:]部分),然後將其替換臨時到別的

tr -d "[:cntrl:]" 

,例如

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

基於對unix的this answer。stackexchange,這應該做的伎倆:

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

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

0

有點遲到了:cat -v <file> 我認爲這是最容易記住的地段!