30

我想使用 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
%
-
.
/

这是十六进制格式的输出:

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

如果我删除所有控制字符,我最终将删除换行符和回车符,它们也用作 Windows 上的换行符。如何删除所有控制字符,只保留“\r\n”等所需的字符?

谢谢。

4

4 回答 4

29

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

$ tr -d '\000-\011\013\014\016-\037' < file.txt > newfile.txt
于 2014-03-09T12:25:23.443 回答
11

基于unix.stackexchange上的这个答案,这应该可以解决问题:

$ cat scriptfile.raw | col -b > scriptfile.clean
于 2017-09-19T13:52:52.367 回答
10

试试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"
于 2016-04-12T00:46:25.363 回答
5

派对有点晚了:cat -v <file> 我认为这是最容易记住的!

于 2018-01-19T11:34:41.073 回答