[笔记]快乐的Linux命令行《二十一》文本处理

103 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第22天,点击查看活动详情

前言

所有类似于 Unix 的操作系统都非常依赖于被用于几种数据类型存储的文本文件。所以这很有道理,有许多用于处理文本的工具。

在这一章中,我们将看一些被用来“切割”文本的程序。

在下一章中,我们将查看更多的文本处理程序,但主要集中于文本格式化输出程序和其它一些人们需要的工具。

本章相关命令:

  • cat –连接文件并且打印到标准输出
  • sort –给文本行排序
  • uniq –报告或者省略重复行
  • cut –从每行中删除文本区域
  • paste –合并文件文本行
  • join –基于某个共享字段来联合两个文件的文本行
  • comm –逐行比较两个有序的文件
  • diffff –逐行比较文件
  • patch –给原始文件打补丁
  • tr –翻译或删除字符
  • sed –用于筛选和转换文本的流编辑器
  • aspell –交互式拼写检查器

一、文本处理

1.1 文本应用程序

到目前为止,我们已经知道了一对文本编辑器(nanovim),看过一堆配置文件,并且目睹了许多命令的输出都是文本格式。

文本还被用来做什么?

cat命令

这个 cat 程序具有许多有趣的选项。其中许多选项用来帮助更好的可视化文本内容。

一个例子是 A 选项,来在文本中显示非打印字符有些时候我们想知道是否控制字符嵌入到了我们的可见文本中。最常用的控制字符是 tab 字符(而不是空格)和回车字符,在 MS-DOS风格的文本文件中回车符经常作为结束符出现。

另一种常见情况是文件中包含末尾带有空格的文本行

让我们创建一个测试文件,用 cat 程序作为一个简单的文字处理器。为此,我们将键入 cat命令(随后指定了用于重定向输出的文件),然后输入我们的文本,最后按下 Enter 键来结束这一行,然后按下组合键 Ctrl-d,来指示 cat 程序,我们已经到达文件末尾了。

我们文本行的开头和末尾分别键入了一个 tab 字符以及一些空格

[me@linuxbox ~]$ cat > foo.txt
The quick brown fox jumped over the lazy dog.
[me@linuxbox ~]$

cat -A 显示这个文本

我们将使用带有 -A 选项的 cat 命令来显示这个文本:

[me@linuxbox ~]$ cat -A foo.txt
^IThe quick brown fox jumped over the lazy dog.     $
[me@linuxbox ~]$

在输出结果中我们看到,这个 tab 字符在我们的文本中由ˆI 字符来表示。

这是一种常见的表示方法,意思是“Control-I”,结果证明,它和 tab 字符是一样的。我们也看到一个 $ 字符出现在文本行真正的结尾处,表明我们的文本包含末尾的空格。

cat -n 1.文本行添加行号 -s 2.禁止输出多个空白行

cat 程序也包含用来修改文本的选项。

最著名的两个选项是 -n,其给文本行添加行号和 -s,禁止输出多个空白行。我们这样来说明:

[me@linuxbox ~]$ cat > foo.txt

The quick brown fox

jumped over the lazy dog.

[me@linuxbox ~]$ cat -ns foo.txt

1 The quick brown fox

2

3 jumped over the lazy dog.

[me@linuxbox ~]$

在这个例子里,我们创建了一个测试文件 foo.txt 的新版本,其包含两行文本,由两个空白行分开。经由带有 -ns 选项的 cat 程序处理之后,多余的空白行被删除,并且对保留的文本行进行编号。然而这并不是多个进程在操作这个文本,只有一个进程。

sort命令 文件进行排序

这个 sort 程序对标准输入的内容,或命令行中指定的一个或多个文件进行排序,然后把排序结果发送到标准输出。

使用与 cat 命令相同的技巧,我们能够演示如何用 sort 程序来处理标准输入:

[me@linuxbox ~]$ sort > foo.txt

c

b

a

[me@linuxbox ~]$ cat foo.txt

a

b

c

输入命令之后,我们键入字母“c”,“b”,和“a”,然后再按下 Ctrl-d 组合键来表示文件的结尾。随后我们查看生成的文件,看到文本行有序地显示。

因为 sort 程序能接受命令行中的多个文件作为参数,所以有可能把多个文件合并成一个有序的文件

例如,如果我们有三个文本文件,想要把它们合并为一个有序的文件,我们可以这样做:

sort file1.txt file2.txt file3.txt > final_sorted_list.txt

image.png

MS-DOS 文本 Vs. Unix 文本

MS-DOS 文本 Vs. Unix 文本

可能你想用 cat 程序在文本中查看非打印字符的一个原因是发现隐藏的回车符。 那么隐藏的回车符来自于哪里呢?

它们来自于 DOS 和 Windows!Unix 和 DOS 在文本文件中定义每行结束的方式不相同。

Unix 通过一个换行符(ASCII 10)来结束一行,(\n)

然而 MS-DOS 和它的衍生品使用回车(ASCII 13)和换行字符序列来终止每个文本行。(\r\n)

有几种方法能够把文件从 DOS 格式转变为 Unix 格式。

在许多 Linux 系统中,有两个程序叫做 dos2unix 和 unix2dos,它们能在两种格式之间转变文本文件。

然而,如果你的系统中没有安装 dos2unix 程序,也不要担心。

文件从 DOS 格式转变为 Unix 格式的过程非常简单;它只简单地涉及到删除违规的回车符。

通过随后本章中讨论的一些程序,这个工作很容易完成。

1.2 比较文本

1.3 运行时编辑

总结