2011年12月22日星期四

《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为字段编号或一段范围的列表(以逗点隔开)
"

没有评论:

发表评论