11.4. 文本处理工具

Tip另请参阅
 

另请参阅本节中的 taccat第 11.2 节,因为它们也可以执行文本处理

sort

在没有选项的情况下,sort 命令默认按字母顺序排序。可以对文本文件运行以按字母顺序对其进行排序(请注意,它也会连接文件),也可以与管道符“|”一起使用以对命令的输出进行排序。

使用 sort -r 反向排序输出,使用 -g 选项进行“数值”排序(即读取整个数字,而不仅仅是第一位数字)。

示例

cat shoppinglist.txt | sort

上面的命令将在购物清单上运行 cat,然后对结果进行排序并按字母顺序显示。

sort -r shoppinglist.txt

上面的命令将在文件上运行 sort,并反向按字母顺序排序文件。

高级排序命令

sort 是一个强大的实用程序,这里介绍一些更难学习(和较少使用)的命令。使用 -t 选项使用特定符号作为分隔符,然后使用 -k 选项指定要按哪一列排序,其中第 1 列是分隔符之前的第一列。如果数值排序不正确,也请使用 -g 选项(不带 -g 选项,sort 只查看数字的第一位)。这是一个复杂的例子

sort -t : -k 4 -k 1 -g /etc/passwd | more 

这将对“/etc/passwd”文件进行排序,使用冒号“:”作为分隔符。它将通过第 4 列(文件中的 GID 部分)进行排序,然后在该排序中使用第一列(名称)来解决任何并列情况。-g 在这里是为了让它按完整数字排序,否则它会将 4000 排在 50 之前(它只会查看第一位数字...)。

join

将两行放在一起,假设它们在相关行上至少共享一个共同值。如果它们没有共同值,则不会打印行。

命令语法

join file1 file2
cut

打印文本行中选定的部分(文本文件),或者换句话说,删除行中的某些部分。您可能希望根据制表符或逗号或您可以想到的任何其他内容删除内容……

cut 的选项:

  • -d --- 允许您指定另一个分隔符,例如“:”通常与 /etc/passwd 一起使用

    cut -d ':' (and probably some more options here) /etc/passwd
  • -f --- 此选项通过列处理文本,根据分隔符分隔。例如,如果您的文件包含诸如“result,somethingelse,somethingelse”之类的行,而您只想获取 result,您将使用

    cut -d ',' -f 1 /etc/passwd 

    这将只获取 /etc/passwd 中的用户名

  • “,”(逗号)--- 用于分隔数字,这些数字允许您剪切特定列。例如

    cut -d ':' -f 1,7 /etc/passwd

    这将仅显示 /etc/passwd 中每个人设置的用户名和 shell。

  • “-”(连字符)--- 用于显示从第 x 行到第 y 行,例如 1-4,(将是从第 1 行到第 4 行)。

    cut -c 1-50 file1.txt

    这将剪切(显示)每行的字符(列)1 到 50(并且该行上的任何其他内容都将被忽略)

  • -x --- 其中 x 是一个数字,从第 1 行剪切到“x”

  • x- --- 其中 x 是一个数字,从“x”剪切到结尾。

    cut -5, 20-, 8 file2.txt

    这将显示(“剪切”)字符(列)1 到 5、8 以及从 20 到结尾。

ispell/aspell

交互式拼写检查文件,提示您替换单词或继续。据说 aspell 更擅长建议替换词,但最好自己找出答案。

aspell 示例

aspell -c FILE.txt

这将在名为“FILE.txt”的特定文件上运行 aspellaspell 将交互式运行并提示用户输入。

ispell 示例

ispell FILE.txt

这将在名为“FILE.txt”的特定文件上运行 ispellispell 将交互式运行并提示用户输入。

chcase

用于将文件名中的大写字母更改为小写字母(反之亦然)。

您也可以使用 tr 来做同样的事情……

cat fileName.txt | tr '[A-Z]' '[a-z]'  > newFileName.txt

上面将使用文件“fileName.txt”作为输入并将结果输出到“newFileName.txt”来将大写转换为小写。

cat fileName.txt | tr '[a-z]' '[A-Z]' > newFileName.txt

上面将使用文件“fileName.txt”作为输入并将结果输出到“newFileName.txt”来将小写转换为大写。

chcase (perl 脚本) 可以在 chcase 主页 找到。

fmt

(format)一个简单的文本格式化程序。将 fmt-u 选项一起使用,以输出具有“统一间距”的文本,其中单词之间的空格减少为一个空格字符,句子之间的空格减少为两个空格字符。

示例

fmt -u myessay.txt

将确保句子之间的空格量为两个空格,单词之间的空格量为一个空格。

paste

将来自两个文件的行放在一起,可以是每个文件的行并排(通常用制表符分隔,但您可以使用任何符号……),也可以是来自每个文件的单词(先是第一个文件,然后是第二个文件)并排。

要获得并排的行列表,第一个文件的第一行在左侧,用制表符分隔,然后是第二个文件的第一行。您将输入

paste file1.txt file2.txt

要按顺序显示列表,第一个文件的第一行,[制表符],第一个文件的第二行,然后是第三行和第四行,直到第一个文件类型结束

paste --serial file1.txt file2.txt

Tip如果您自己创建一个示例,此命令非常容易理解
 

如果您为自己创建一个示例,那就容易多了。只有几行,我使用了“第一个文件的第一行”和“第二个文件的第一行”等等,作为一个快速示例。

expand

将制表符转换为空格并输出。使用选项 -t num 来指定“制表位”的大小,即每个制表符之间的字符数。

命令语法

expand file_name.txt

unexpand

将空格转换为制表符并输出。

命令语法

unexpand file_name.txt
uniq

从文件中删除重复条目,有时会大大简化显示。

uniq 选项

  • -c --- 计算每个重复项的出现次数

  • -u --- 仅列出唯一条目

  • -d --- 仅列出重复条目

例如

uniq -cd phone_list.txt

这将仅显示任何重复条目以及该条目出现的次数。

tr

(translation)。一个过滤器,可用于替换文本文件中的所有字符实例或“压缩”空白。

示例

cat some_file | tr '3' '5' > new_file

这将对某个文件运行 cat 程序,此命令的输出将发送到 tr 命令,tr 将替换所有 3 的实例为 5,就像查找和替换一样。您还可以执行其他操作,例如

cat some_file | tr '[A-Z]' '[a-z]' > new_file

这将对 some_file 运行 cat 并将任何大写字母转换为小写字母(您也可以使用它来更改文件名的大小写……)。

Tip替代方案
 

您还可以使用单行 Perl 命令执行查找和替换,请阅读本节末尾的内容。

nl

行号工具,它的默认操作是将其输入(作为参数给出的文件名或标准输入)写入标准输出。

行号添加到每一行,并且文本会缩进。

此命令可以执行一些更高级的编号选项,只需阅读有关它的信息页面即可。

这些高级选项主要与编号的自定义有关,包括用于节/页/页脚等的不同形式的分隔。

也可以尝试 cat -n(对所有行编号)或 cat -b(对所有非空白行编号)。有关 cat 的更多信息,请查看本节:第 11.2 节

您可以通过两种方式使用 nl

nl some_text_file.txt

上面的命令将为 some_text_file 的每一行添加编号。您可以像下面的示例中所示使用 nl 为某些内容的输出编号;

grep some_string some_file | nl
Perl 搜索和替换文本

要在文件中搜索和替换文本,请使用以下单行 Perl 命令[1]

$ perl -pi -e "s/oldstring/newstring/g;" filespec [RET]

在此示例中,“oldstring” 是要搜索的字符串,“newstring 是要替换它的字符串,而 “filespec” 是要处理的文件名或文件。您可以将其用于多个文件。

示例:要将当前目录中所有文件中的字符串“helpless”替换为字符串“helpful”,请键入

$ perl -pi -e "s/helpless/helpful/g;" * [RET]

也可以尝试使用 tr 来做同样的事情(请参阅本节前面的内容)。

Tip如果这些工具太原始
 

如果这些文本工具对于您的目的来说太简单,那么您可能正在考虑进行一些编程或脚本编写。

如果您想了解有关 bash 脚本编写的更多信息,请参阅 Mendel Cooper 撰写的 高级 bash 脚本编写指南

sed 和 awk 是用于处理文本的传统 UNIX 系统工具,本指南未对其进行解释。sed 在逐行基础上执行替换,而 awk 可以执行类似的任务或通过处理文件并打印出某些信息来提供帮助(它是一种编程语言)。

您通常会在您的 GNU/Linux 系统上找到它们,并且会在互联网上找到许多教程,如果您必须对文本文件执行许多类似的操作,请随时查找它们。

注释

[1]

此信息取自 Linux Cookbook(未经编辑)。有关更多信息,请参见 参考书目 中的 [3]。