我有一个文本文件,其中包含来自不同语言(如中文、拉丁文等)的字符
我想删除所有包含这些非英文字符的行。我想包括所有英文字符 (ab)、数字 (0-9) 和所有标点符号。
我如何使用 awk 或 sed 等 unix 工具来做到这一点。
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
)。
编辑:这也可以用 grep 来完成:
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