我有一个包含不同语言字符的文本文件(例如中文、拉丁字母等)
我想要删除所有包含非英文字符的行,只保留英文字母(a-b)、数字(0-9)和所有标点符号。
请问如何使用 Unix 工具如 awk 或 sed 实现?
Perl支持一个[:ascii:]
字符类。
perl -nle 'print if m{^[[:ascii:]]+$}' inputfile
您可以使用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
)。LC_CTYPE=C grep -v '[^[:alnum:][:space:][:punct:]]' my_file
使用支持perl兼容正则表达式的GNU grep,您可以使用以下命令:
grep -P '^[[:ascii:]]+$' file
egrep -v
仅返回不匹配模式的行,并使用类似于[^ a-zA-Z0-9.,;:-'"?!]
的模式(根据需要包括更多标点符号)。嗯,考虑一下,双重否定(-v
和反转字符类)可能并不那么好。另一种方法可能是^[ a-zA-Z0-9.,;:-'"?!]*$
。您还可以过滤ASCII码。egrep -v "[^ -~]" foo.txt