如何从文件中删除非ASCII字符?删除文件中的非ASCII字符
回答
如果你想使用Perl,像这样做:
perl -pi -e 's/[^[:ascii:]]//g' filename
详解
下面的解释涵盖了上面的命令假设读者的每一个部分是不熟悉解决方案中的任何...
perl
运行perl解释器。 Perl是一种编程语言,通常可在所有类Unix系统上使用。该命令需要在shell提示符下运行。
-p
的
-p
标志告诉Perl在输入文件中的每一行迭代,在各行指定的命令(后述),然后打印结果。这相当于将您的Perl程序包装在while(<>) { /* program... */; } continue { print; }
中。有一个类似的-n
标志可以完成相同的操作,但省略了continue { print; }
块,所以如果您想进行自己的打印,则可以使用该标志。-i
的
-i
标志告诉perl的输入文件是在地方和输出应该返回到该文件进行编辑。这对于实际修改文件很重要。省略此标志会将输出写入STDOUT
,然后您可以将其重定向到新文件。注意,你不能忽略
-i
和重定向STDOUT
输入文件为已读之前,这将痛殴输入文件。这就是shell的工作原理,与perl无关。-i
标志智能地解决了这个问题。Perl和外壳让你多单字符参数组合成一个这就是为什么我们可以用
-pi
代替-p -i
的
-i
标志带一个参数,它是一个文件扩展名,如果你想使用做一个原始文件的备份,所以如果你使用-i.bak
,那么perl会在进行更改之前将输入文件复制到filename.bak
。在这个例子中我省略了创建一个备份,因为我希望你将使用版本控制反正:)-e
的
-e
标志告诉perl的下一个参数是封装在一个完整的Perl程序串。如果你有一个很长的程序,那么这并不总是一个好主意,因为这个程序可能无法读取,但是通过我们这里的一个命令程序,它的简洁性可以提高易读性。注意,我们不能
-e
标志和-i
标志作为二者的结合参加一个参数,和Perl将认为第二个标志是参数,因此,举例来说,如果我们使用-ie <program> <filename>
, perl会假设<program>
和<filename>
都是输入文件,并尝试创建<program>e
和<filename>e
,前提是e
是要用于备份的扩展。这将失败,因为<program>
不是一个真正的文件。反过来(-ei
)也不会工作,因为perl会尝试执行i
作为一个程序,这会导致编译失败。s/.../.../
这是Perl的正则表达式基础替换操作符。它有四个参数。第一个出现在操作员面前,如果未指定,则使用默认值
$_
。第二个和第三个符号在/
之间。第四个是在最后的/
之后,在这种情况下是g
。$_
在我们的代码中,第一个参数是$_
其是在Perl的默认循环变量。如上所述,-p
标志将我们的程序包装在while(<>)
中,该程序创建一个while
循环,从输入中一次读取一行(<>
)。它隐含地将该行分配给$_
,并且如果未指定,则采用单个参数的所有命令都将使用该行(例如:只是调用print;
实际上将转换为print $_;
)。因此,在我们的代码中,s/.../.../
运算符在输入文件的每一行上运行一次。[^[:ascii:]]
第二个参数是要在输入字符串中搜索的模式。这个模式是一个正则表达式,所以包含在[]
内的任何东西都是一个括号表达式。本节可能是本示例中最复杂的部分,因此我们将在最后详细讨论它。<empty string>
第三个参数是替换字符串,在我们的例子中是空字符串,因为我们要删除所有非ascii字符。g
第四个参数是替换运算符的修饰符标志。g
标志指定替代在输入中的所有匹配中应该是全局的。没有这个标志,只有第一个实例会被替换。其他可能的标志是不区分大小写的匹配的i
,仅与多行字符串相关的s
和m
(这里我们有单行字符串),o
,它指定该模式应该被预编译(这对于长文件可能是有用的)和x
,它指定该模式可以包含空格和注释以使其更易读(但如果是这种情况,我们不应该在单行上写我们的程序)。
filename
这是包含我们想去掉非ASCII字符输入文件。
[^[:ascii:]]
所以,现在让我们来详细讨论[^[:ascii:]]
。
如上所述,正则表达式中的[]
指定了括号表达式,该表达式指示正则表达式引擎匹配输入中与表达式内字符集中任何一个字符匹配的单个字符。因此,例如,[abc]
将匹配a
或b
或c
,并且它将仅匹配单个字符。使用^
作为第一个字符反转匹配,所以[^abc]
将匹配不是a
,b
或c
的任何一个字符。
但括号内的[:ascii:]
表达式呢?
如果您有一个基于unix的系统,请在命令行运行man 7 re_format
来阅读手册页。如果不是,read the online version
[:ascii:]
是一个字符类,它代表整个ascii
字符集,但这种字符类只能在括号表达式中使用。使用此的正确方法是[[:ascii:]]
,它可能会与上面的abc
情况一样否定,或者与括号表达式结合在其他字符中,因此,例如,[éç[:ascii:]]
将匹配所有ascii字符以及é
和ç
,它们不是ascii,和[^éç[:ascii:]]
将匹配所有不是ascii的字符,也不匹配é
或ç
。
tr -dc [:graph:][:cntrl:] < input-file > cleaned-file
这是假设你想保留“控制”字符和“可打印”字符。根据需要拨弄。
'tr -dc'\ 11 \ 12 \ 15 \ 40- \ 176'
您可以编写一个C程序是这样的:避免了为简单起见,错误检查:
#include <stdio.h>
#include <ctype.h>
int main(int argc, char **argv)
{
FILE *fin = fopen("source_file", "rb");
FILE *fout = fopen("target_file", "w");
int c;
while ((c = fgetc(fin)) != EOF) {
if (isprint(c))
fputc(c, fout);
}
fclose(fin);
fclose(fout);
return 0;
}
注意。
与编译:
$ gcc -W source_code.c -o convert
与运行:
$ ./convert
- 1. 从CSV中删除非ASCII字符
- 2. 删除数据文件中的非ASCII字符
- 3. 使用python从文件中删除非ASCII字符
- 4. 从文件中删除非ASCII *行*
- 5. 试图只删除非ASCII字符
- 6. 删除非ASCII字符(使用Microsoft.Office.Interop.Excel)
- 7. 文字中的非ASCII,非Unicode字符
- 8. 从Perl中的文件中删除包含非ASCII字符的行
- 9. 需要删除ASCII字符
- 10. 删除空格ascii字符
- 11. Python的非ASCII字符“\ XE2”文件
- 12. 删除字符串中的所有非ASCII
- 13. 从文本文件中删除所有ASCII字符
- 14. 在Python中删除任何给定的字符串类型的非ASCII字符
- 15. 从NSString中删除非ASCII字符在objective-c
- 16. C中的非ASCII字符
- 17. fputcsv中的非ascii字符
- 18. PHP中的非ASCII字符?
- 19. 删除特定的HTML标记和非ASCII字符
- 20. 只有在条件适用的情况下删除非ASCII字符,在bash中
- 21. 删除文件名中的所有非数字字符
- 22. 删除无效的ascii字符的Python
- 23. wxStyledTextCtrl非ASCII字符
- 24. FWRITE非ASCII字符
- 25. Python非ASCII字符
- 26. 删除非ASCII字符并在非ASCII字符使用Perl的字段中追加空格全部删除双“quote”?
- 27. Notepad ++删除非英文数字字符
- 28. 从语料库中删除非ASCII文件
- 29. 如何使用sed删除非ASCII字符
- 30. 反转包含ASCII字符和非ASCII字符的字符串
有一个非常类似的线程在这里,询问有关在UNIX文件中找到非ASCII字符:HTTP://堆栈溢出。com/questions/3001177/how-do-i-grep-for-non-ascii-characters-in-unix – hotshot309 2012-06-18 16:01:54