你可能会常在管道(pipeline)中间使用 sed,以执行替换操作。做法是使用 s 命令--要求正则表达式寻找,用替代文本替换匹配的文本,以及可选用的标志:
sed 's/:.*//' /etc/passwd/ | sort -u 删除第一个冒号之后的所有东西,排序列表并删除重复部分
sed
语法
sed [ -n ] 'editing command' [ file ... ] 单个命令
sed [ -n ] -e 'editing command' ... [ file ... ] 多个命令
sed [ -n ] -f script-file ... [ file ... ] 从脚本中读取命令
用途
为了编辑它的输入流,将结果生成到标准输出,而非以交互式编辑器的方式来编辑文件。虽然 sed 的命令很多,能做很复杂的工作,但它最常用的还是处理输入流的文本替换,通常是作为管道的一部分。
主要选项
-e 'editing command'
将 editing command 使用在输入数据上。当有多个命令需应用时,就必须使用 -e 了。
-f script-file
自 script-file中读取编辑命令。当有多个命令需要执行时,此选项相当有用。
-n
不是每个最后已修改结果行都正常打印,而是显示以p指定(处理过的)的行。
行为模式
读取每个输入文件的每一行,假如没有文件的话,则是标准输入。以每一行来说,sed 会执行每一个应用到输入行的 editing command。结果会写到标准输出(默认状态下,或是显示地使用p命令及-n选项)。若无 -e 或 -f 选线,则 sed 会把第一个参数看作是要使用的 editing command。
在这里,/字符扮演定界符(delimiter)的角色,从而分隔正则表达式与替代文本。在本例中,替代文本是空的,实际上会有效地删除匹配的文本。虽然/是最常用的定界符,但任何可显示的字符都能作为定界符。在处理文件名称时,通常都会以标点符号字符作为定界符(例如分号、冒号或逗点):
find /home/tolstoy -type d -print 寻找所有目录
sed 's;/home/tolstoy/;/home/lt/;' 修改名称;注意:这里使用分号作为定界符
sed 's/^/mkdir /' 插入mkdir命令
sh -x 以Shell跟踪模式执行
上述脚本是将 /home/tolstoy 目录结构建立一份副本在 /home/lt 下。这个脚本使用了产生命令的手法,使命令内容称为Shell的输入。这是一个功能很强且常见的技巧,但却很少人这么用。