从文件中删除包含非英语(Ascii)字符的行

时间:2012-07-20 10:42:09

标签: regex unix sed awk grep

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

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

如何使用awk或sed等unix工具来完成。

4 个答案:

答案 0 :(得分:18)

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

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

答案 1 :(得分:4)

如果您强制使用C语言环境,则可以使用Awk:

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:

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

答案 2 :(得分:3)

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

嗯,想一想,双重否定(-v和倒置的角色类)可能不那么好。另一种方式可能是^[ a-zA-Z0-9.,;:-'"?!]*$

您也可以只过滤ASCII:

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

答案 3 :(得分:2)

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

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