【问题标题】:How to list all of the unique non-ascii characters in a file?如何列出文件中所有唯一的非ASCII字符?
【发布时间】:2019-11-28 00:12:22
【问题描述】:

考虑一下这个README.md,它包含许多非ascii unicode 字符。

我想使用 bash 提取所有唯一的非 ascii 字符(最好在 OSX 上)。

例如,我想作为输出:

²
³
½
×
–
‖
→
↔
∀
∂
∆
∈
≈
≥
️
????
????

目前,我有一个比较繁琐的命令,不知道是否可以改进:

LC_ALL=C  cat README.md | sed -n "s/\(.\)/\1 /pg" | tr ' ' '\n' | grep  '[^ -~]' | sort | uniq

related question, but awk-based answers are printed as byte-code

【问题讨论】:

  • 我会使用 perl:perl -CiIO -nle '$h{$_}++ for /\P{ASCII}/g;END{print for keys %h}' /path/to/README.md。这可以很容易地更改以对它们进行排序或显示每个有多少。

标签: bash sed unicode ascii


【解决方案1】:

sed 's/[\x00-\x7F]//g' 是我能想到的过滤掉 ASCII 字符的最简单方法。您可以将其与grep -o . 结合使用,以使每行一个字符。而sort -u 等价于sort | uniq。这一切都给出了:

$ echo 2²?3³ | sed 's/[\x00-\x7F]//g' | grep -o . | sort -u
?
²
³

【讨论】:

    【解决方案2】:

    使用 Python,从 shell:

    python3 -c "print('\n'.join(sorted(char for char in open('README.md').read() if ord(char) > 127)))"
    

    不重复:

    python3 -c "print('\n'.join(sorted({char for char in open('README.md').read() if ord(char) > 127})))"
    

    【讨论】:

    • 我想可能有一个光滑的 python unique 我可以在这里使用它来避免重复?
    • 是的-我在答案中添加了这一点-只需将最里面的生成器表达式括在{ } 中就可以产生“集合理解”,最终结果是只保留了一个字符(然后输入“排序”调用)
    【解决方案3】:

    使用 grep 的变体:

    grep -ohP '[^\x00-\x7F]' README.md | sort -u
    

    【讨论】:

    • 在 OSX 上,BSD grep 不支持这一点,但安装 GNU grep(通过 brew install grep 然后 ggrep 支持)。
    猜你喜欢
    • 2017-03-16
    • 2018-06-21
    • 2011-03-01
    • 2011-03-13
    • 1970-01-01
    • 2010-12-04
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多