学习 Linux,101:文本流和过滤器(5)

Expand、unexpand 和 tr

在创建 text1 和 text2 文件时,我们使用制表符创建了 text2。有时候,您可能希望将制表符替换为空格,或者相反。expand 和 unexpand 命令可以实现这个目的。这两个命令的 -t 选项允许您设置选项卡停顿(stop)。设置一个单一值,它将以此为间隔设置重复的制表符。清单 10 展示了如何将 text2 中的制表符展开为单个空格,以及 expand 和 unexpand 如何将 text2 中的文本打散。


清单 10. 使用 expand 和 unexpand
[ian@echidna lpi103-2]$ expand -t 1 text2 9 plum 3 banana 10 apple [ian@echidna lpi103-2]$ expand -t8 text2|unexpand -a -t2|expand -t3 9 plum 3 banana 10 apple  

不幸的是,您不能使用 unexpand 将 text1 中的空格替换为制表符,因为 unexpand 至少需要两个空格才能替换为制表符。然而,可以使用 tr 命令,它将一个集合(set1)中的字符转换为另一个集合(set2)中的对应字符。清单 11 展示如何使用 tr 将空格转换为制表符。由于 tr 是纯粹的过滤器,因此您将使用 cat 命令为其生成输入。这一示例也解释了如何使用 - 表示 cat 的标准输入,因此我们可以将 tr 的输出与 text2 文件连接起来。


清单 11. 使用 tr
[ian@echidna lpi103-2]$ cat text1 |tr ' ' '\t'|cat - text2 1 apple 2 pear 3 banana 9 plum 3 banana 10 apple  

如果您不能确定最后两个例子中发生的操作,那么尝试使用 od 来依次终止管道中的每个阶段;例如,
cat text1 |tr ' ' '\t' | od -tc


学习 Linux,101:文本流和过滤器


学习 Linux,101:文本流和过滤器

 

学习 Linux,101:文本流和过滤器



   
 


Pr、nl 和 fmt

pr 命令用于格式化文件以执行输出。默认的头部(header)包含文件名和文件创建日期和时间,以及一个页号和两行空白页脚。当从多个文件或标准输入流创建输出时,可以使用当前日期和时间替换文件名和创建日期。可以在列中并排输出文件并通过各种选项控制格式化的各个方面。请参考手册页获得详细信息。

nl 命令可以对行进行编号,这在输出文件时非常方便。也可以使用 cat 命令的 -n 选项对行进行编号。清单 12 展示了如何输出文本文件,以及如何为 text2 编号并将其与 text1 并排输出。


清单 12. 编号和格式化文件以方便输出
[ian@echidna lpi103-2]$ pr text1 | head 2009-08-11 14:02 text1 Page 1 1 apple 2 pear 3 banana [ian@echidna lpi103-2]$ nl text2 | pr -m - text1 | head 2009-08-11 15:36 Page 1 1 9 plum 1 apple 2 3 banana 2 pear 3 10 apple 3 banana  

另一个用于格式化文件的有用命令是 fmt 命令,它将格式化文本以使其能够适合边距。您可以联接多个较短的行,以及拆分较长的行。在清单 13 中,我们使用 !#:* 历史特性的变体创建了包含较长一行文本的 text3,避免了四次输入句子的工作。我们还创建了每行只包含 1 个单词的 text4。然后使用 cat 显示未进行格式化的文件,其中包含一个 ‘$’ 字符表示行结束。最后,使用 fmt 将文件格式化为包含 60 字符的最大宽度。请参考手册页获得其他选项的介绍。


清单 13. 格式化为最大行长度
[ian@echidna lpi103-2]$ echo "This is a sentence. " !#:* !#:1->text3 echo "This is a sentence. " "This is a sentence. " "This is a sentence. ">text3 [ian@echidna lpi103-2]$ echo -e "This\nis\nanother\nsentence.">text4 [ian@echidna lpi103-2]$ cat -et text3 text4 This is a sentence. This is a sentence. This is a sentence. $ This$ is$ another$ sentence.$ [ian@echidna lpi103-2]$ fmt -w 60 text3 text4 This is a sentence. This is a sentence. This is a sentence. This is another sentence.  

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/27840.html