首页 文章

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

提问于
浏览
11

我有一个文本文件,其中包含来自不同语言的字符,如(中文,拉丁语等)

我想删除包含这些非英文字符的所有行 . 我想要包括所有英文字符(a-b),数字(0-9)和所有标点符号 .

如何使用像awk或sed这样的unix工具来完成它 .

4 回答

  • 3

    Perl支持 [:ascii:] 字符类 .

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

    如果强制使用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
    
  • 17

    您可以使用 egrep -v 仅返回与模式不匹配的行,并使用类似 [^ a-zA-Z0-9.,;:-'"?!] 的模式(根据需要包含更多标点符号) .

    嗯,考虑一下,双重否定( -v 和倒置的角色类)可能不那么好 . 另一种方式可能是 ^[ a-zA-Z0-9.,;:-'"?!]*$ .

    您也可以只过滤ASCII:

    egrep -v "[^ -~]" foo.txt
    
  • 2

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

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

相关问题