在 Linux 命令行中的文本文件中查找非 ASCII 字符

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
如何在linux的文本文件中查找非ascii字符

3. 使用 tr 命令

虽然 tr(或 translate)命令主要用于翻译字符,但它也可用于删除字符,这就是我要在这里做的。

需要明确的是,它不会删除文件的实际内容,而是会修改我将通过使用获得的输出 '[:print:]'

tr -d '[:print:]' < Non-ASCII.txt
使用 tr 命令在文本文件中查找非 ascii 字符

4.使用sed命令

⚠️确保创建原始文本文件的副本,因为 sed 命令会修改原始文件。

sed 实用程序通常在可执行文件序列过于复杂的情况下使用,它与我们在这里处理的类似。

但是 sed 提供的远不止这些,如果您经常处理复杂的工作负载,您应该查看 SED 的详细指南:

现在,让我们使用给定的命令找出非 ASCII 字符:

LC_ALL=C sed -i 's/[^x0-xB1]//g' Non-ASCII.txt
使用 sed 命令在 linux 中查找非 ascii 字符

它不显示任何非 ASCII 字符。 不用担心,命令已成功执行,稍后我会告诉您在哪里查找非 ASCII 字符。

但首先,让我分解执行的命令:

  • LC_ALL=C 将本地化设置设置为最简单 C.
  • -i 就地编辑文件,这意味着它将修改原始文件。
  • 's/[^x0-xB1]//g' 是匹配非 ASCII 字符的表达式。

正如我前面提到的,sed 命令突出显示了可以通过 cat 命令访问的非 ASCII 字符:

cat Non-ASCII.txt
使用 cat 命令查找 sed 命令所做的更改

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
使用 pcregrep 命令在文本文件中查找非 ascii 字符

看起来很像吧? 为了更清楚,让我为您分解:

这里:

  • --color="auto" 突出显示非 ASCII 字符。
  • -n 显示每一行有非 ASCII 字符的数字。
  • "[x80-xFF]" 匹配 ASCII 字符范围之外的字符。

同样,您也可以使用 [:ascii:] 字符类 ^ 过滤非 ASCII 字符:

pcregrep --color="auto" -n "[^[:ascii:]]" Non-ASCII.txt
使用 pcregrep 命令在 linux 中查找非 ascii 字符

最后的话

这是我对如何在 Linux 的文本文件中查找非 ASCII 字符的看法。

如果您有任何疑问,请务必在评论部分留下 ASCII 字符。