我想使用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%$
Run Code Online (Sandbox Code Playgroud)
这将使用grep列出所有控制字符:
$ cat file.txt | head -n 10 | grep '[[:cntrl:]]'
+
1
-
-
1
%
-
.
/
Run Code Online (Sandbox Code Playgroud)
匹配cat命令的上述输出.
现在,我运行以下命令来显示所有不包含控制字符的行,但它仍然显示与上面相同的输出(带有控制字符的行)
$ cat file.txt | head -n 10 | grep '[^[:cntrl:]]'
+
1
-
-
1
%
-
.
/
Run Code Online (Sandbox Code Playgroud)
这是十六进制格式的输出:
$ 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
Run Code Online (Sandbox Code Playgroud)
如您所见,十六进制值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.
Run Code Online (Sandbox Code Playgroud)
如果我删除所有控制字符,我将最终删除换行符和回车符,用作Windows上的换行符.如何删除所有控制字符,只保留所需的控制字符,如"\ r \n"?
谢谢.
Kyl*_*our 21
而不是使用预定义[:cntrl:]集,当你观察到的包括\n和\r,只是名单(八进制),你想摆脱的控制字符:
$ tr -d '\000-\011\013\014\016-\037' < file.txt > newfile.txt
Run Code Online (Sandbox Code Playgroud)
尝试grep,例如:
grep -o "[[:print:][:space:]]*" in.txt > out.txt
Run Code Online (Sandbox Code Playgroud)
它将仅打印字母数字字符,包括标点符号和空格字符,例如制表符、换行符、垂直制表符、换页、回车和空格。
为了减少限制并仅删除控制字符( [:cntrl:]),请通过以下方式删除它们:
tr -d "[:cntrl:]"
Run Code Online (Sandbox Code Playgroud)
如果您想保留\n(这是 的一部分[:cntrl:]),则将其暂时替换为其他内容,例如
cat file.txt | tr '\r\n' '\275\276' | tr -d "[:cntrl:]" | tr "\275\276" "\r\n"
Run Code Online (Sandbox Code Playgroud)
根据关于unix.stackexchange的答案,这应该可以解决问题:
$ cat scriptfile.raw | col -b > scriptfile.clean
Run Code Online (Sandbox Code Playgroud)