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

15

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

我想要删除所有包含非英文字符的行,只保留英文字母(a-b)、数字(0-9)和所有标点符号。

请问如何使用 Unix 工具如 awk 或 sed 实现?

4个回答

22

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

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

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

4

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

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

3
您可以使用egrep -v仅返回不匹配模式的行,并使用类似于[^ a-zA-Z0-9.,;:-'"?!]的模式(根据需要包括更多标点符号)。嗯,考虑一下,双重否定(-v和反转字符类)可能并不那么好。另一种方法可能是^[ a-zA-Z0-9.,;:-'"?!]*$。您还可以过滤ASCII码。
egrep -v "[^ -~]" foo.txt

我需要所有的标点符号。那么是否有可能只过滤掉所有非 ASCII 字符,而不是指定允许的字符列表呢? - Sudar
1
这也许与您的主要观点有些牵强,但是在某些语言环境中,范围[a-z]包括非ASCII字符。例如,在我的系统上,“echo é | grep [a-z]”确实可以找到é。 - Lily

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接