我有一个包含不同语言字符的文本文件,如(中文,拉丁语等)
我想删除包含这些非英文字符的所有行。我想要包括所有英文字符(a-b),数字(0-9)和所有标点符号。
如何使用awk或sed等unix工具来完成。
答案 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