尝试从 UNIX 文件中删除不可打印的字符(垃圾值)
Trying to remove non-printable characters (junk values) from a UNIX file
我正在尝试从我的文件中的记录中删除不可打印的字符(例如 ^@
)。由于文件中的记录量太大,因此使用 cat 不是一种选择,因为循环花费了太多时间。
我尝试使用
sed -i 's/[^@a-zA-Z 0-9`~!@#$%^&*()_+\[\]\{}|;'\'':",.\/<>?]//g' FILENAME
但 ^@
字符仍未删除。
我也尝试使用
awk '{ sub("[^a-zA-Z0-9\"!@#$%^&*|_\[](){}", ""); print } FILENAME > NEW FILE
但也无济于事。
有人可以建议一些替代方法来删除不可打印的字符吗?
使用了 tr -cd
但它正在删除重音字符。但是他们在文件中是必需的。
也许您可以使用 [:print:]
的补码,其中包含所有可打印字符:
tr -cd '[:print:]' < file > newfile
如果您的 tr
版本不支持多字节字符(似乎很多都不支持),这对我来说适用于 GNU sed(使用 UTF-8 语言环境设置):
sed 's/[^[:print:]]//g' file
首先删除所有控制字符:
tr -dc '[=10=]7-12-50-6' < file > newfile
然后试试你的字符串:
sed -i 's/[^@a-zA-Z 0-9`~!@#$%^&*()_+\[\]\{}|;'\'':",.\/<>?]//g' newfile
我相信你看到的^@
实际上是一个零值[=13=]
。
上面的 tr
过滤器也将删除它们。
strings -1 file... > outputfile
似乎有效。 strings 程序将获取所有可打印字符,在本例中长度为 1(-1 参数)并打印它们。它有效地删除了所有不可打印的字符。
“man strings”将提供文档。
搜索了一段时间并找到了一个相当简单的解决方案:
软件包 ansifilter
正是这样做的。您需要做的就是通过它输出管道。
在 Mac 上:
brew install ansifilter
然后:
cat file.txt | ansifilter
我正在尝试从我的文件中的记录中删除不可打印的字符(例如 ^@
)。由于文件中的记录量太大,因此使用 cat 不是一种选择,因为循环花费了太多时间。
我尝试使用
sed -i 's/[^@a-zA-Z 0-9`~!@#$%^&*()_+\[\]\{}|;'\'':",.\/<>?]//g' FILENAME
但 ^@
字符仍未删除。
我也尝试使用
awk '{ sub("[^a-zA-Z0-9\"!@#$%^&*|_\[](){}", ""); print } FILENAME > NEW FILE
但也无济于事。
有人可以建议一些替代方法来删除不可打印的字符吗?
使用了 tr -cd
但它正在删除重音字符。但是他们在文件中是必需的。
也许您可以使用 [:print:]
的补码,其中包含所有可打印字符:
tr -cd '[:print:]' < file > newfile
如果您的 tr
版本不支持多字节字符(似乎很多都不支持),这对我来说适用于 GNU sed(使用 UTF-8 语言环境设置):
sed 's/[^[:print:]]//g' file
首先删除所有控制字符:
tr -dc '[=10=]7-12-50-6' < file > newfile
然后试试你的字符串:
sed -i 's/[^@a-zA-Z 0-9`~!@#$%^&*()_+\[\]\{}|;'\'':",.\/<>?]//g' newfile
我相信你看到的^@
实际上是一个零值[=13=]
。
上面的 tr
过滤器也将删除它们。
strings -1 file... > outputfile
似乎有效。 strings 程序将获取所有可打印字符,在本例中长度为 1(-1 参数)并打印它们。它有效地删除了所有不可打印的字符。
“man strings”将提供文档。
搜索了一段时间并找到了一个相当简单的解决方案:
软件包 ansifilter
正是这样做的。您需要做的就是通过它输出管道。
在 Mac 上:
brew install ansifilter
然后:
cat file.txt | ansifilter