代码之家  ›  专栏  ›  技术社区  ›  Amandasaurus

除了新行以外,我如何删除所有非单词字符?

  •  0
  • Amandasaurus  · 技术社区  · 15 年前

    我有一个这样的文件:

    my line - some words & text
    oh lóok i've got some characters
    

    我想“规范化”它并删除所有非单词字符。我想以这样的方式结束:

    mylinesomewordstext
    ohlóokivegotsomecharacters
    

    我现在在命令行上使用Linux,我希望有一个我能使用的班轮。

    我试过这个:

    cat file | perl -pe 's/\W//'
    

    但那就去掉了所有的新行,把所有的都放在一行。有什么方法可以告诉Perl中不包括换行符吗? \W ?还是有别的办法?

    5 回复  |  直到 15 年前
        1
  •  7
  •   sth Alien    15 年前

    这将删除不匹配的字符 \w \n :

    cat file | perl -C -pe 's/[^\w\n]//g'
    
        2
  •  4
  •   Mark Rushakoff    15 年前

    @sth的解决方案使用perl,它(至少在我的系统上)与unicode不兼容,因此它丢失了重音o字符。

    另一方面, sed Unicode兼容(根据 the lists on this page ,并给出正确的结果:

    $ sed 's/\W//g' a.txt
    mylinesomewordstext
    ohlóokivegotsomecharacters
    
        3
  •  2
  •   brian d foy    15 年前

    在Perl中,我只需添加-l开关,它通过将换行符追加到每个print()的末尾来重新添加换行符:

     perl -ple 's/\W//g' file
    

    注意你不需要 cat

        4
  •  1
  •   dcruz    15 年前

    先前的回应并没有回应“_3”这个字。至少对我来说。

    sed 's/\W//g' file
    
        5
  •  1
  •   Sam Bisbee    15 年前

    shell脚本的最佳实践要求您使用tr程序替换单个字符,而不是sed,因为它更快、更高效。显然,如果替换较长的字符串,请使用sed。

    tr-d'[:blank:][:punct:'<文件

    随着时间流逝,我得到:

    实0m0.003s
    用户0m0.000s
    系统0m0.004s

    当我运行sed应答(sed-e's/\w//g'文件)时,我得到:

    实0m0.003s
    用户0m0.004s
    系统0m0.004s

    虽然没有“巨大”的差异,但是在对较大的数据集运行时,您会注意到差异。另外,请注意,我没有将cat的输出通过管道传递到tr,而是使用i/o重定向(少生成一个进程)。