我有一个文本文件,其中包含来自不同语言的字符,如(中文,拉丁语等)
我想删除包含这些非英文字符的所有行 . 我想要包括所有英文字符(a-b),数字(0-9)和所有标点符号 .
如何使用像awk或sed这样的unix工具来完成它 .
Perl支持 [:ascii:] 字符类 .
[:ascii:]
perl -nle 'print if m{^[[:ascii:]]+$}' inputfile
如果强制使用C语言环境,则可以使用Awk:
LC_CTYPE=C awk '! /[^[:alnum:][:space:][:punct:]]/' my_file
环境变量 LC_TYPE=C (或 LC_ALL=C )强制使用C语言环境进行字符分类 . 它更改了字符类( [:alnum:] , [:space:] 等)的含义,以仅匹配ASCII字符 .
LC_TYPE=C
LC_ALL=C
[:alnum:]
[:space:]
/[^[:alnum:][:space:][:punct:]]/ 正则表达式匹配任何非ASCII字符的行 . 正则表达式之前 ! 反转条件 . 因此,只有没有任何非ASCII字符的行才会匹配 . 然后,由于没有给出任何操作,默认操作用于匹配行( print ) .
/[^[:alnum:][:space:][:punct:]]/
!
print
编辑:这也可以用grep完成:
LC_CTYPE=C grep -v '[^[:alnum:][:space:][:punct:]]' my_file
您可以使用 egrep -v 仅返回与模式不匹配的行,并使用类似 [^ a-zA-Z0-9.,;:-'"?!] 的模式(根据需要包含更多标点符号) .
egrep -v
[^ a-zA-Z0-9.,;:-'"?!]
嗯,考虑一下,双重否定( -v 和倒置的角色类)可能不那么好 . 另一种方式可能是 ^[ a-zA-Z0-9.,;:-'"?!]*$ .
-v
^[ a-zA-Z0-9.,;:-'"?!]*$
您也可以只过滤ASCII:
egrep -v "[^ -~]" foo.txt
使用支持perl兼容正则表达式的GNU grep,您可以使用:
grep -P '^[[:ascii:]]+$' file
4 回答
Perl支持
[:ascii:]
字符类 .如果强制使用C语言环境,则可以使用Awk:
环境变量
LC_TYPE=C
(或LC_ALL=C
)强制使用C语言环境进行字符分类 . 它更改了字符类([:alnum:]
,[:space:]
等)的含义,以仅匹配ASCII字符 ./[^[:alnum:][:space:][:punct:]]/
正则表达式匹配任何非ASCII字符的行 . 正则表达式之前!
反转条件 . 因此,只有没有任何非ASCII字符的行才会匹配 . 然后,由于没有给出任何操作,默认操作用于匹配行(print
) .编辑:这也可以用grep完成:
您可以使用
egrep -v
仅返回与模式不匹配的行,并使用类似[^ a-zA-Z0-9.,;:-'"?!]
的模式(根据需要包含更多标点符号) .嗯,考虑一下,双重否定(
-v
和倒置的角色类)可能不那么好 . 另一种方式可能是^[ a-zA-Z0-9.,;:-'"?!]*$
.您也可以只过滤ASCII:
使用支持perl兼容正则表达式的GNU grep,您可以使用: