《Classic Shell Scripting》:sed and cut

一. sed

一般来说,执行文本替换的正确程序应该是sed --- 流编辑器(Stream Editor)。sed的设计就是用来以批处理的方式而不是交互的方式来编辑文件。当你知道要做好几个变更 --- 不管是对一个还是数个文件时,比较简单的方式是将这些变更部分写到一个编辑中的脚本里,再将此脚本应用到所有需要修改的文件。 你可能会常在管道中间使用sed,以执行替换操作。做法是使用s命令 --- 要求正则表达式寻找,用替代文本替换匹配的文本:

sed 's/:.*//' /etc/passwd       #删除第一个冒号之后的所有东西
sort -u                          #排序列表并删除重复部分

在这里,/字符扮演定界符(delimiter)的角色,从而分隔正则表达式与替代文本。在本例中,替代文本是空的,实际上会有效地删除匹配的文本。虽然/是最常用的定界符,但任何可显示的字符都能作为定界符。在处理文件名称,通常都会以标点符号字符作为定界符(例如分号,冒号或逗点):

find /home/tolstoy -type d -print    #寻找所有目录
sed 's;/home/tolstoy/;/home/lt/;'    #修改名称;
sed 's/^/mkdir /'                    #插入mkdir命令
sh -x                                 #以Shell跟踪模式执行

语法

sed [-n] 'editing command' [file ...]
sed [-n] -e 'editing command' ... [file ...]
sed [-n] -f script-file ... [file ...]

主要选项

-e 'editing command' : 将editing command应用于输入数据上。当有多个命令需要应用时,就必须使用-e了。
-f script-file : 自script-file中读取编辑命令。当有多个命令需要执行时,此选项相当有用。
-n : 不是每个最后已修改结果行都正常打印,而是显示以p指定(处理过)的行。

行为模式

读取每个输入文件的每一行,假如没有文件的话,则是标准输入。以每一行来说,sed会执行每一个应用到输入行的editing command。结果会写到标准输出(默认状态下,或是显示地使用p命令及-n选项)。若无-e或-f选项,则sed会把第一个参数看作是要使用的editing command。

二. cut

cut命令是用来剪下文本文件里的数据,文本文件可以是字段类型或是字符类型。后一种数据类型在遇到需要从文件里剪下特定的列时,特别方便。请注意:一个制表符在此被视为单个字符。

举例来说,下面的命令可显示系统上每个用户的登录名称及其全名:

cut -d : -f 1,5 /etc/passwd     #取出字段

下面的命令取出命令ls -l的输出结果中的文件权限字段:

ls -l | cut -c 1-10

"

语法

cut -c list [ file ...]
cut -f list [ -d delim ] [ file ...]

用途

从输入文件中选择一个或多个字段或者一组字符,配合管道,可再做进一步处理。

主要选项

-c list : 以字符为主,执行剪下的操作。list为字符编号或一段范围的列表(以逗点隔开),例如1,3,5-12,42。
-d delim : 通过-f选项,使用delim作为定界符。默认的定界符为制表字符(Tab)
-f list : 以字段为主,做剪下操作。list为字段编号或一段范围的列表(以逗点隔开)

"