ASCII(美国信息交换标准代码)最初是为编码英文字母而开发的,仅限于 128 个字符。
通过本教程,我将解释在文本文件中查找非 ASCII 字符的各种方法。
如何在 Linux 中查找非 ASCII 字符
在完成该过程之前,让我们看一下我将要使用的示例:
[email protected]:~$ cat Non-ASCII.txt
Short guide on how to find Non-ASCII characters from text file by LHB
한국어 샘플 텍스트 ¶ÆÇφϖ℘ℑℜ
A ŠÄMρLë T∈XT to find Non-ÅŠÇÎI Characters
1. 使用 Perl
这可能会让您感到惊讶,但 Perl 最初的目的是搜索、提取和打印信息,所以让我们使用 Perl:
perl -ne 'print if /[^[:ascii:]]/' sample.txt
如果您感到困惑,Perl 会得到包含任何非 ASCII 字符的行。 所以让我分解这里使用的选项:
-ne
是两个标志的组合-n
和-e
用于先创建一个新行,然后继续执行。print if /[^[:ascii:]]
是查找和打印包含非 ASCII 字符的行背后的逻辑。
2.使用grep命令
在 Linux 中,我们通常使用模式来搜索特定项目,在这种情况下,像 grep 这样的实用程序可以使过程变得更加容易。
请记住,根据您对 shell 所做的配置,您会得到不同的结果。
grep --color="auto" -P -n "[x80-xFF]" Non-ASCII.txt
这里,
--color="auto"
突出显示匹配的模式。-P
将解释 Perl 兼容的表达式。-n
用于显示数字包含非 ASCII 字符的行。“[x80-xFF]”
是非 ASCII 字符的定义范围。
与之前的查询相比,更改范围给了我更好的结果:
grep --color="auto" -P -n "[^x00-x7F]" Non-ASCII.txt

3. 使用 tr 命令
虽然 tr(或 translate)命令主要用于翻译字符,但它也可用于删除字符,这就是我要在这里做的。
需要明确的是,它不会删除文件的实际内容,而是会修改我将通过使用获得的输出 '[:print:]'
:
tr -d '[:print:]' < Non-ASCII.txt

4.使用sed命令
⚠️确保创建原始文本文件的副本,因为 sed 命令会修改原始文件。
sed 实用程序通常在可执行文件序列过于复杂的情况下使用,它与我们在这里处理的类似。
但是 sed 提供的远不止这些,如果您经常处理复杂的工作负载,您应该查看 SED 的详细指南:
现在,让我们使用给定的命令找出非 ASCII 字符:
LC_ALL=C sed -i 's/[^x0-xB1]//g' Non-ASCII.txt

它不显示任何非 ASCII 字符。 不用担心,命令已成功执行,稍后我会告诉您在哪里查找非 ASCII 字符。
但首先,让我分解执行的命令:
LC_ALL=C
将本地化设置设置为最简单C
.-i
就地编辑文件,这意味着它将修改原始文件。's/[^x0-xB1]//g'
是匹配非 ASCII 字符的表达式。
正如我前面提到的,sed 命令突出显示了可以通过 cat 命令访问的非 ASCII 字符:
cat Non-ASCII.txt

5. 使用 pcregrep
pcregrep 实用程序只不过是与 Perl 正则表达式预兼容的 grep。 简单来说,pcgrep 的行为与 grep 相同 -P
.
但它需要手动安装,可以通过给定的命令安装:
对于基于 Debian 的发行版:
sudo apt install pcregrep
对于基于 RHEL 的发行版:
yum install pcregrep
所以让我们使用 pcregrep 来搜索非 ASCII 字符:
pcregrep --color="auto" -n "[x80-xFF]" Non-ASCII.txt

看起来很像吧? 为了更清楚,让我为您分解:
这里:
--color="auto"
突出显示非 ASCII 字符。-n
显示每一行有非 ASCII 字符的数字。"[x80-xFF]"
匹配 ASCII 字符范围之外的字符。
同样,您也可以使用 [:ascii:]
字符类 ^
过滤非 ASCII 字符:
pcregrep --color="auto" -n "[^[:ascii:]]" Non-ASCII.txt

最后的话
这是我对如何在 Linux 的文本文件中查找非 ASCII 字符的看法。
如果您有任何疑问,请务必在评论部分留下 ASCII 字符。