从文件中删除控制字符

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

有一些像EOF(0x1A)控制字符,尤其是当我在另一个软件中加载我的文件时,导致问题。 我想删除这个。

这是我迄今为止所尝试的:

这将列出所有的控制字符:

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 file.txt | head -n 10 | grep '[[:cntrl:]]' + 1 - - 1 % - . / 

匹配cat命令的上述输出。

现在,我运行下面的命令来显示所有不包含控制字符的行,但它仍然显示与上面相同的输出(带有控制字符的行)

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

这里是hex格式的输出:

 $ 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 

如你所见,hex值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”所需的控制字符?

谢谢。

Solutions Collecting From Web of "从文件中删除控制字符"

而不是使用预先定义的[:cntrl:]集,正如你所观察到的,包括\n\r ,只要列出(八进制)你想摆脱的控制字符:

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

尝试grep ,如:

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

它将只打印包括标点符号和空格字符(如制表符,换行符,垂直制表符,换页符,回车符和空格)的字母数字字符。

为了减少限制,只删除控制字符 ( [:cntrl:] ),删除它们:

 tr -d "[:cntrl:]" 

如果你想保留\n (它是[:cntrl:] ),那么暂时把它替换成别的东西,例如

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

根据unix.stackexchange上的这个答案 ,这应该可以做到这一点:

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