【问题标题】:How can I find extended ASCII characters in a file using Perl?如何使用 Perl 在文件中查找扩展的 ASCII 字符?
【发布时间】:2010-10-27 06:50:56
【问题描述】:

如何使用 Perl 在文件中查找扩展的 ASCII 字符?谁能拿到剧本?

......提前谢谢......

【问题讨论】:

    标签: perl parsing encoding extended-ascii


    【解决方案1】:

    由于扩展的ASCII 字符具有128 and higher 的值,您只需对单个字符调用ord 并处理值>= 128 的字符。以下代码从标准输入读取并仅打印扩展的ASCII 字符:

    while (<>) {
      while (/(.)/g) {
        print($1) if (ord($1) >= 128);
      }
    }
    

    或者,unpackchr 也可以使用。示例:

    while (<>) {
      foreach (unpack("C*", $_)) {
        print(chr($_)) if ($_ >= 128);
      }
    }
    

    (我确信一些 Perl 大师可以将这两个都浓缩为两个单行...)


    要打印行号,您可以使用以下命令(这不会删除重复项,并且在传递 unicode 时会出现奇怪的行为):

    while (<>) {
      while (/(.)/g) {
        print($. . "\n") if (ord($1) >= 128);
      }
    }
    

    (感谢Yaakov Belch 提供$. 提示。)

    【讨论】:

    • 这是一种非常缓慢且无效的方法,请参阅 Dave Sherohman 的解决方案stackoverflow.com/questions/881931/… 它更快更简单。
    • 这个答案是在戴夫之前发布的。我见过 Dave 的方法,在大多数情况下它是首选。这只是表明我是 Perl 新手。我选择不删除这个答案,因为最后一部分似乎完全符合提问者的要求。另见stackoverflow.com/questions/882122/…
    • ...啊,该页面已被删除。可以这么说,问题表明应该为 each 扩展 ASCII 字符打印行号。这就是我的解决方案所做的。
    【解决方案2】:

    第一个可打印的 ASCII 字符是space (32)。最后一个可打印的 ASCII 字符是 ~ (126)。所以我可能会使用

    while (<>) {
      print "$.\n" if /[^ -~]/;
    }
    

    当然,它也会显示包含控制字符和扩展 ASCII 的行。

    编辑:更改为打印行号而不是行本身。

    【讨论】:

    • 打印行号而不是行很容易:while() { print "$.\n" if /[^ -~]/;} 这应该可以解决上述问题
    • 哎呀!我只是在阅读问题本身并错过了标题指定他想要行号。谢谢你的收获。
    【解决方案3】:

    Oneliner:

    perl -nE'say$.if/[\xE0-\xFF]/'
    

    对于旧的 perl 版本

    perl -lne'print$.if/[\xE0-\xFF]/'
    

    【讨论】:

      【解决方案4】:

      一个关键的问题是

      使用字节;

      编译指示应该生效。海报应该决定这一点。对于选择代码大于 127 的 字符,以下内容就足够了:

      print grep 127 < ord, split // while <>;
      

      print grep /[^[:ascii:]]/, split // while <>;
      

      【讨论】:

        【解决方案5】:

        Hynek -Pichi- Vychodil 的回答:

        perl -nE'say$.if/[\xE0-\xFF]/'
        

        只测试非打印的有限部分大概应该是

        perl -nE'say$.if/[\x80-\xFF]/'
        

        改为。

        【讨论】:

          【解决方案6】:

          grep 呢?

          grep [\x00-\x1F\x7F-\xFF]+ *
          

          【讨论】:

            猜你喜欢
            • 2011-04-14
            • 2017-07-20
            • 2013-08-19
            • 2011-04-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-07-01
            • 1970-01-01
            相关资源
            最近更新 更多