如何在Linux中的文本文件中查找非ASCII字符
1. 概述
非 ASCII 字符是那些没有用 ASCII 编码的字符,例如 Unicode、EBCDIC 等。ASCII 限制为 128 个字符,最初是为英语开发的。
在本教程中,我们将介绍一些用于在文本文件中查找和突出显示非 ASCII 字符的工具。
2. 设置
让我们创建一个文件sample.txt,其中包含多行和一些行中的非 ASCII 字符:
$ cat >> sample.txt
This is an article on finding non-ASCII characters on Blogdemo
/日/本/人/ /中/國/的/ /~/=/[/]/(/)/%/+/{/}/@/;/’/#/!/$/_/&/-/ / /é/è/ / /;/∞/¥/₤/€/
We hopè you find it [[email protected]](/cdn_cgi/l/email_protection)€
Thank You!
我们将在整个教程中使用它作为示例文件。
3. 使用grep
grep 代表全局正则表达式 print。它在输入中搜索特定的字符模式并输出所有匹配的行。 grep命令有不同的变体。默认情况下,几乎所有 Linux 分发系统都可以使用它。在这里,我们将关注最广泛使用的 GNU grep。
我们可以使用这个命令来查找所有非 ASCII 字符:
$ grep --color='auto' -P -n "[\x80-\xFF]" sample.txt
现在,让我们通过分解来理解这个命令:
- –color=‘auto’:指定匹配模式的部分何时应着色。如果输出直接写入终端,“ auto” 值会突出显示匹配的字符串。其他选项 包括‘always’、’never’、*’tty’*等。
- -P : 将模式解释为 Perl 兼容的正则表达式
- -n:显示每个匹配的行和行号
- “[\x80-\xFF]” : 匹配不在 ASCII 范围内的字符的正则表达式
根据我们的系统设置,上述命令可能不起作用。它只会显示一些存在的非 ASCII 字符。另一种方法是grep此命令的逆操作,它更有效:
$ grep --color='auto' -P -n "[^\x00-\x7F]" sample.txt
或者,我们可以使用字符类 grep逆:
$ grep --color='auto' -n "[^[:ascii:]]" sample.txt
这是我们得到的回应:
此命令仅显示包含非 ASCII 字符的行。此外,它以红色突出显示非 ASCII 字符。
我们使用*“[^\x00-\x7F]”和“[^[:ASCII:]]”*作为正则表达式。它们匹配 ASCII 范围内所有字符的反转。
4. 使用pcregrep
**pcregrep 是用于执行文件搜索特定字符模式的实用程序。**它利用PCRE 正则表达式库来支持与 Perl 5 兼容的特定模式。我们可以通过包管理器安装它。
让我们使用这个命令在 Debian、Ubuntu 或 Kali 发行版上安装 :
$ sudo apt install pcregrep
在 Red Hat 发行版中,我们可以使用yum:
$ yum install pcregrep
接下来,让我们使用pcregrep在我们的sample.txt文件中检查非 ASCII 字符:
$ pcregrep --color='auto' -n "[\x80-\xFF]" sample.txt
或者,我们可以使用字符类 :
$ pcregrep --color='auto' -n "[^[:ascii:]]" sample.txt
我们得到这个输出:
以下是命令的细分:
- –color=”auto”:指定匹配模式的部分何时应着色
- -n:显示每个匹配的行和行号
- “[\x80-\xFF]”:匹配ASCII格式以外的任何字符范围的正则表达式
我们可以在输出中看到所有非 ASCII 字符都已被替换并用红色突出显示。
5. 使用perl
perl 最初是为扫描、提取和打印任意文本文件中的信息而构建的。
它已发展成为一种广泛用于许多系统管理任务的通用编程语言。
perl在大多数 Linux 发行版上默认可用。如果它丢失了,我们可以安装它:
$ sudo apt-get install perl
接下来,让我们使用perl查找非 ASCII 字符:
$ perl -ne 'print if /[^[:ascii:]]/' sample.txt
/日/本/人/ /中/國/的/ /~/=/[/]/(/)/%/+/{/}/@/;/’/#/!/$/_/&/-/ /é/è/ /;/∞/¥/₤/€/
We hopè you find it [[email protected]](/cdn_cgi/l/email_protection)€
默认情况下,上面的命令只显示包含非 ASCII 字符的行。
让我们分解命令来理解它:
- -ne:两个组合标志*(-n 和 -e)*,分别创建一个新行并执行打印命令
- ‘print if…’ : 打印所有非 ASCII 字符的小程序
- /[^[:ascii]]/ : 匹配任何非 ASCII 字符的正则表达式
6. 使用tr
我们可以使用tr 或translate命令来翻译或删除特定字符。**它预装在所有主要的 Linux 发行版中。
tr允许我们执行文本转换,例如大写到小写、删除特定字符模式等。
让我们用它来删除示例文件中的所有 ASCII 字符:
$ tr -d '[:print:]' < sample.txt
日本人中國的’éè∞¥₤€
è€
我们使用*-d标志来删除所有 ASCII 字符。我们还使用[:print:]’*来匹配所有可打印的 ASCII 字符。
上面的命令删除所有存在的 ASCII 字符。它只打印未删除的非 ASCII 字符。
7. 使用sed
sed 用于对文件执行不同的功能,如搜索、查找和替换等。它使我们可以从命令行快速编辑文件,甚至无需打开它们。
让我们使用sed查找所有非 ASCII 字符:
$ LC_ALL=C sed -i 's/[^\x0-\xB1]//g' sample.txt
现在,让我们了解命令的每个部分:
- LC_ALL=C:覆盖所有其他本地化设置的环境变量。在这里,我们将其设置为最简单的C设置。
- -i:用于在不打开文件的情况下就地编辑文件
- ’s/[^...’ : 匹配所有非 ASCII 字符的正则表达式
上面的命令编辑我们的原始输入文件。建议在运行命令之前创建输入文件的副本。
默认情况下,上面的命令不会显示任何输出。我们可以使用cat 命令来检查更改:
$ cat sample.txt
This is an article on finding non-ASCII characters on Blogdemo
/�/�/�/�/ /�/�/�/�/�/ /~/=/[/]/(/)/%/+/{/}/@/;/�/�/#/!/$/_/&/-/ /�/�/ /;/�/�/�/�/�/�/�/
We hop� you find it [[email protected]](/cdn_cgi/l/email_protection)��
我们也可以使用这个sed命令来突出显示非 ASCII 字符:
$ sed -n 'l' sample.txt
This is an article on finding non-ASCII characters on Blogdemo$
\346\227\245\346\234\254\344\272\272 \344\270\255\345\234\213\347\232\
/\/2/0/4/ /~/=/[/]/(/)/%/+/{/}/@/;/\/3/4/2/\/2/0/0/\/2/3/1/#/!/$/_/&/-/ /\/3/0/3/\/2/5/1/\/3/0/3/\/2/5/0/ /;/\/3/4/2/\/2/1/0/\/2/3/6/\/
...truncated
此命令用其八进制值替换每次出现的非 ASCII 字符。