关于正则表达式:从文件中删除包含非英语(Ascii)字符的行

Remove lines that contain non-english (Ascii) characters from a file

我有一个文本文件,其中包含来自不同语言(例如中文,拉丁语等)的字符

我想删除所有包含这些非英语字符的行。我要包括所有英文字符(a-b),数字(0-9)和所有标点符号。

如何使用awk或sed之类的unix工具来实现它。


Perl支持[:ascii:]字符类。

1
perl -nle 'print if m{^[[:ascii:]]+$}' inputfile

对于支持perl兼容正则表达式的GNU grep,您可以使用:

1
grep -P '^[[:ascii:]]+$' file

只要您强制使用C语言环境,就可以使用Awk:

1
LC_CTYPE=C awk '! /[^[:alnum:][:space:][:punct:]]/' my_file

环境变量LC_TYPE=C(或LC_ALL=C)强制使用C语言环境进行字符分类。它更改字符类([:alnum:][:space:]等)的含义以仅匹配ASCII字符。

/[^[:alnum:][:space:][:punct:]]/正则表达式用任何非ASCII字符匹配行。正则表达式前的!反转条件。因此,只有没有任何非ASCII字符的行才会匹配。然后,由于未给出任何操作,因此默认操作用于匹配行(print)。

编辑:也可以使用grep:

1
LC_CTYPE=C grep -v '[^[:alnum:][:space:][:punct:]]' my_file

您可以使用egrep -v仅返回与模式不匹配的行,并使用诸如[^ a-zA-Z0-9.,;:-'"?!]之类的模式(根据需要包括更多标点符号)。

考虑一下,

嗯,双重否定(-v和反向字符类)可能不是那么好。另一种方法可能是^[ a-zA-Z0-9.,;:-'"?!]*$

您也可以只过滤ASCII:

1
egrep -v"[^ -~]" foo.txt