15

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

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

我如何使用 awk 或 sed 等 unix 工具来做到这一点。

4

4 回答 4

22

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

perl -nle 'print if m{^[[:ascii:]]+$}' inputfile
于 2012-07-20T11:10:31.400 回答
4

您可以使用 Awk,前提是您强制使用 C 语言环境:

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
于 2012-07-20T14:14:02.967 回答
4

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

grep -P '^[[:ascii:]]+$' file
于 2017-09-08T07:16:37.780 回答
3

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

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

您也可以只过滤 ASCII:

egrep -v "[^ -~]" foo.txt
于 2012-07-20T10:44:53.367 回答