2013-02-04 84 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> 我认为这是最容易记住的地段!