SED 手册
中央研究院计算中心 ASPAC 计划(刘刚 2008年5月7号 整理 ganghust@gmail.com)
aspac@phi.sinica.edu.tw 技术报告: 96005 1996年12月1日 Version:1.0
SED 手册............................................................................................................................................................................................. 1
1.Introduction ..............................................................................................................................................................................2
1.1 何时使用 sed .............................................................................................................................................................. 3
1.2 何处获得 sed .............................................................................................................................................................. 3
1.3 sed 能做那些编辑动作 ...............................................................................................................................................3
1.4 sed 如何工作 ............................................................................................................................................................... 3
2 使用 sed .................................................................................................................................................................................. 4
2.1.执行命令列上的编辑指令 .......................................................................................................................................... 4
2.2 sed 的编辑指令 ........................................................................................................................................................... 4
2.3 执行档案内的编辑指令 ............................................................................................................................................. 6
2.4 执行多个文件檔的编辑 ............................................................................................................................................. 6
2.5.执行输出的控制 .......................................................................................................................................................... 7
3.范例............................................................................................................................................................................................7
3.1 替换文件中的数据 ..................................................................................................................................................... 7
3.2 搬动文件中的数据 ..................................................................................................................................................... 8
3.3 删除文件中的数据 ..................................................................................................................................................... 9
3.4 搜寻文件中的数据 ..................................................................................................................................................... 9
4 介绍函数参数 ........................................................................................................................................................................10
4.1 s ................................................................................................................................................................................... 10
4.2 d.....................................................................................................................................................................................11
4.3 a ...................................................................................................................................................................................11
4.4 i ....................................................................................................................................................................................12
4.5 c ...................................................................................................................................................................................13
4.6 p ...................................................................................................................................................................................13
4.7 l ....................................................................................................................................................................................13
4.8 r ................................................................................................................................................................................... 13
4.9 w ..................................................................................................................................................................................14
4.10 y .................................................................................................................................................................................14
4.11 ! ................................................................................................................................................................................. 15
4.12 n .................................................................................................................................................................................15
4.13 q .................................................................................................................................................................................15
4.14 = ................................................................................................................................................................................ 16
4.15 # .................................................................................................................................................................................16
4.16 N ................................................................................................................................................................................16
1
4.17 D ................................................................................................................................................................................17
4.18 P .................................................................................................................................................................................17
4.19 h .................................................................................................................................................................................18
4.20 H ................................................................................................................................................................................18
4.21 g .................................................................................................................................................................................18
4.22 G ................................................................................................................................................................................18
4.23 x .................................................................................................................................................................................19
4.24 b、:label ....................................................................................................................................................................19
4.25 t ..................................................................................................................................................................................20
批注.............................................................................................................................................................................................22
1.Introduction
1.Introduction
1.Introduction
(Stream EDitor)为 UNIX 系统上提供将编辑工作自动化的编辑器 , 使用者无需直接编辑数据。使用者可利用 sedsedsed
都以行为单位编辑文件 ,
SedSedSed
所提供 20 多种不同的函数参数 , 组合(批注 [1])它们完成不同的编辑动作。此外 , 由于 sedsedsed
故其亦是行编辑器(line editor)。
sed 是一个非交互式上下文(context)编辑器,它被设计在下列三种情况下发挥作用:
1) 编辑那些对舒适的交互式编辑而言太大的文件。
2) 在编辑命令太复杂而难于在交互模式下键入的时候编辑任何大小的文件。
3) 要在对输入的一趟扫描中有效的进行多个‘全局’(global)编辑函数。
因为每次只把输入的某些行驻留在内存中,并且不使用临时文件,所以可编辑的文件的有效大小,只受限于输入和输出
要同时共存于次级存储的要求。
可以单独的建立复杂的编辑脚本并作为给 sed 的命令文件。对于复杂的编辑,这节省了可观的键入和随之而来的错误。
从命令文件运行 sed 高效于作者所知道的任何交互式编辑器,甚至包括能用预先写好的脚本驱动的编辑器。
相较于交互式编辑器而言,根本性的损失是缺乏相对地址(由于操作是每次一行的),和缺乏对命令如期运行的立即验证。
sed 是 UNIX 编辑器 ed 的直系后代。由于在交互式和非交互式操作之间的差异,在 ed 和 sed 之间已经有了可观的
变化;甚至 ed 的惯常用户都会经常感到惊讶(并可能气愤),如果他们没有阅读本文档的章节 2 和 3,就草率的使用 sed
的话。在两个编辑器之间最显著的家族性共同之处,在于他们所识别的模式(‘正则表达式’)的种类;匹配模式的代码可以
从 ed 的代码几乎原封不动的复制过来,在章节 2 中对正则表达式的描述就是从 UNIX Programmer’s Manual[1] 几乎原
封不动的复制过来的。(代码和描述都是 Dennis M. Ritchie 写的)。
一般 sedsedsed
等。这些相较于一般 UNIX 编辑器(交谈式的, 如 vi、emacs)用手动的方式修改檔 , sedsedsed
别介绍:
何时使用 sedsedsed
最常用在编辑那些需要不断重复某些编辑动作的档上 , 例如将文件中的某个字符串替换成另一个字符串等
用起来较省力。下面几节将分
2
何处获得 sedsedsed
sedsedsed
sedsedsed
能做那些编辑动作
如何工作
1.11.11.1
何时使用 sed
在修改檔时 , 如果不断地重复某些编辑动作 , 则可用 sedsedsed
1000 封电子信件内的发信人属名 "Tom" 改成 "John" , 此时只要在命令列上执行一简单的 sedsedsed
"Tom" 字符串替换成 "John"。
再者 , 当檔需要许多不同编辑动作时 , 则 sedsedsed
空白行删除、替换字符串、并将使用者输入的文字添加在文件的第六行等等不同的编辑动作。
一次可执行那些不同的编辑动作。例如 sedsedsed
自动一次执行这些编辑动作。例如要使 received 文件内
命令就可把檔内所有的
能一次执行完将檔中所有
, 则可透过 anonymous ftp 到下列地方去取得 :
。不同的 UNIX 系统所附的 sedsedsed
版本亦不尽相同。若读者所使用的 UNIX 系
1.21.21.2
何处获得 sed
一般的 UNIX 系统 , 本身即附有 sedsedsed
统上未附有 sedsedsed
phi.sinica.edu.tw:/pub/GNU/gnu
gete.sinica.edu.tw:/unix/gnu
ftp.edu.tw:/UNIX/gnu
ftp.csie.nctu.edu.tw:/pub/Unix/GNU
ftp.fcu.edu.tw: /pub3/UNIX/gnu
axp350.ncu.edu.tw:/Packages/gnu
leica.ccu.edu.tw :/pub2/gnu
mail.ncku.edu.tw :/pub/unix/gnu
bbs.ccit.edu.tw :/pub1/UNIX/gnu
prep.ai.mit.edu.tw:/pub/gnu
1.31.31.3
sed 能做那些编辑动作
sedsedsed
可删除(delete)、改变(change)、添加(append)、插入(insert)、合并、交换文件中的数据行 , 或读入其它文件的数据
到文件中 , 也可替换(substuite)它们其中的字符串、或转换(tranfer)其中的字母等等。例如将檔中的连续空白行删成一行、
"local" 字符串替换成 "remote" 、"t" 字母转换成 "T"、将第 10 行数据与第 11 数据合并等。
1.41.41.4
sed 如何工作
如同其它 UNIX 命令 , sedsedsed
"UNIX" ,
在图中 , 上方 standard input 为标准输入 , 是读取数据之处 ; standard output 为标准输出 , 是送出结果之处 ; 中间
由标准输入读入编辑文件并由标准输出送出结果。下图表示 sedsedsed
将资料行 "Unix" 替换成
3
方块的下面两个虚线方块表示 sedsedsed
的工作流程。其中 , 左边虚线方块表示 sedsedsed
将标准输入数据置入 pattern space ,
script 则表示一组执行的编辑指令。
将 pattern space 中编辑完毕后的数据送到标准输出。
sedsedsed
右边虚线方块表示 sedsedsed
在虚线方块中 , 两个实线方块分别表示 pattern space 与 sedsedsed
所 ; 而 sedsedsed
在图中, 左边虚线方块 "Unix" 由标准输入置入 pattern space ; 接着 , 在右边虚线方块中 , sedsedsed
辑指令 s/Unix/UNIX/ (批注 [2]) , 结果 "Unix" 被替换成 "UNIX" , 之后 , "UNIX" 由 pattern space 送到标准输出。
总合上述所言 , 当 sedsedsed
script 的编辑指令逐一对
pattern space 内的数据执行编辑 , 之后 , 再由 pattern space 内的结果送到标准输出 , 接着再将下一行数据读入。如此
重复执行上述动作 , 直至读完所有数据行为止。
由标准输入读入一行数据并放入 pattern space 时 , sedsedsed
script。其 中 , pattern space 为一缓冲区 , 它是 sedsedsed
执行 sedsedsed
script 中的编
工作场
依照 sedsedsed
222
使用使用使用
sed
SedSedSed
命令列可分成编辑指令与文件文件部份。其中 , 编辑指令负责控制所有的编辑工作 ; 檔檔表示所处理的档案。
利用它的地址参数来决定编辑
的编辑指令均由位址(address)与函数(function)两部份组成 , 其中 , 在执行时 , sedsedsed
sedsedsed
的对象;而用它的函数参数(批注[3])编辑。
此外 , sedsedsed
编辑指令 , 除了可在命令列上执行 , 也可在档案内执行。其中差别只是在命令列上执行时 , 其前必须加
执行编辑指令是依照它们在命令列
上选项 -e ; 而在档案(批注[4])内时 , 则只需在其文件名前加上选项 -f。另外 , sedsedsed
上或檔内的次序。
下面各节 , 将介绍执行命令列上的编辑指令 、sedsedsed
编辑指令、执行档案内的编辑指令、执行多个档案的编辑、及执
行 sedsedsed
输出控制。
2.1.2.1.2.1.
执行命令列上的编辑指令
当编辑指令(参照[section 2.2])在命令列上执行时 , 其前必须加上选项 -e 。其命令格式如下 :
sedsedsed
-e '编辑指令1' -e '编辑指令2' ... 文件檔
其中 , 所有编辑指令都紧接在选项 -e 之后 , 并置于两个 " ' " 特殊字符间。另外 , 命令上编辑指令的执行是由左而
右。
一般编辑指令不多时 , 使用者通常直接在命令上执行它们。例如 , 删除 yel.dat 内 1 至 10 行数据 , 并将其余文字
中的 "yellow" 字符串改成 "black" 字符串。此时 , 可将编辑指令直接在命令上执行 , 其命令如下 :
sedsedsed
-e '1,10d' -e 's/yellow/black/g' yel.dat
在命令中 , 编辑指令 '1,10d'(批注[5])执行删除 1 至 10 行数据 ; 编辑指令 's/yellow/black/g'(批注[6]) , "yellow" 字符
串替换(substuite)成 "black" 字符串。
2.22.22.2
sed 的编辑指令
sedsedsed
编辑指令的格式如下 :
[address1[,address2]]function[argument]
其中 , 地址参数 address1 、address2 为行数或 regular expression 字符串 , 表示所执行编辑的数据行 ; 函数参数 funct
4
ion[argument] 为 sedsedsed
下面两小节 , 将仔细介绍地址参数的表示法与有哪些函数参数供选择。
2.2.1 地址(address)参数的表示法
的内定函数 , 表示执行的编辑动作。
实际上 , 地址参数表示法只是将要编辑的数据行 , 用它们的行数或其中的字符串来代替表示它们。下面举几个例子
说明(指令都以函数参数 d(参照[section4.2]) 为例) :
删除文件内第 10 行数据 , 则指令为 10d。
删除含有 "man" 字符串的数据行时 , 则指令为 /man/d。
删除档内第 10 行到第 200 行数据, 则指令为 10,200d。
删除档内第 10 行到含 "man" 字符串的数据行 , 则指令为 10,/man/d。
接下来 , 以地址参数的内容与其个数两点 , 完整说明指令中位址参数的表示法(同样也以函数参数 d 为例)。
地址参数的内容:
地址为十进制数 : 此数字表示行数。当指令执行时 , 将对符合此行数的数据执行函数参数指示的编辑动作。例如 , 删
除数据文件中的第 15 行数据 , 则指令为 15d(参照[section4.2])。其余类推 ,如删除数据文件中的第 m 行数据 , 则指
令为 md 。
地址为 regular expression(参照[附录 A]):
当数据行中有符合 regular expression 所表示的字符串时 , 则执行函数参数指示的编辑动作。另外 , 在 regular
expression 前后必须加上 "/"。例如指令为 /t.*t/d , 表示删除所有含两 "t" 字母的数据行。其中 , "." 表示任意字符; "*"
表示其前字符可重复任意次 , 它们结合 ".*" 表示两 "t" 字母间的任意字符串。
地址参数的个数 : 在指令中 , 当没有地址参数时 , 表示全部数据行执行函数参数所指示的编辑动作; 当只有一地址参
数时 , 表示只有符合地址的数据行才编辑 ; 当有两个地址参数 , 如 address1,address2 时 , 表示对数据区执行编辑 ,
address1 代表起始数据行 , address2 代表结束资料行。对于上述内容 , 以下面例子做具体说明。
例如指令为
d
其表示删除文件内所有数据行。
例如指令为
5d
其表示删除文件内第五行资料。
例如指令为
1,/apple/d
其表示删除资料区 , 由檔内第一行至内有 "apple" 字符串的数据行。
例如指令为
/apple/,/orange/d
其表示删除资料区 , 由檔内含有 "apple" 字符串至含有 "orange" 字符串的数据行
2.2.2 有那些函数(function)参数
下页表仲介绍所有 sedsedsed
的函数参数(参照[chapter 4])的功能。
函数参数 功能
: label 建立 script file 内指令互相参考的位置。
# 建立批注
{ } 集合有相同位址参数的指令。
! 不执行函数参数。
= 印出资料行数( line number )。
5
a\ 添加使用者输入的数据。
b label 将执行的指令跳至由 : 建立的参考位置。
c\ 以使用者输入的数据取代数据。
d 删除数据。
D 删除 pattern space 内第一个 newline 字母 \ 前的数据。
g 拷贝数据从 hold space。
G 添加资料从 hold space 至 pattern space 。
h 拷贝数据从 pattern space 至 hold space 。
H 添加资料从 pattern space 至 hold space 。
l 印出 l 资料中的 nonprinting character 用 ASCII 码。
i\ 插入添加使用者输入的数据行。
n 读入下一笔资料。
N 添加下一笔资料到 pattern space。
p 印出资料。
P 印出 pattern space 内第一个 newline 字母 \ 前的数据。
q 跳出 sedsedsed
编辑。
r 读入它檔内容。
s 替换字符串。
t label 先执行一替换的编辑指令 , 如果替换成牛p>;则将编辑指令跳至 : label 处执行。
w 写资料到它文件内。
x 交换 hold space 与 pattern space 内容。
y 转换(transform)字符。
虽然 , sedsedsed
成大部份的编辑任务。
只有上表所述几个拥有基本编辑功能的函数 , 但由指令中位址参数和指令与指令间的配合 , 也能使 sedsedsed
完
2.32.32.3
执行档案内的编辑指令
当执行的指令太多 , 在命令列上撰写起来十分混乱 , 此时 , 可将这些指令整理储存在档案(譬如檔名为 script_file )
内 , 用选项 -f script_file , 则让 sedsedsed
执行 script_file 内的编辑指令。其命令的格示如下 :
sedsedsed
-f script_file 文件檔
其中 , 执行 script_file 内编辑指令的顺序是由上而下。例如上一节的例子 , 其可改成如下命令:
sedsedsed
-f ysb.scr yel.dat
其中 , ysb.scr 檔的内容如下 :
1,10d
s/yellow/black/g
另外 , 在命令列上可混合使用选项 -e 与 -f , sedsedsed
执行指令顺序依然是由命令列的左到右, 如执行至 -f 后档案内的
指令 , 则由上而下执行。
2.42.42.4
执行多个文件檔的编辑
6
在 sedsedsed
命令列上 , 一次可执行编辑多个檔檔 , 它们跟在编辑指令之后。例如 , 替换 white.dat、red.dat、black.dat 文
件内的 "yellow" 字符串成 "blue" , 其命令如下:
sedsedsed
-e 's/yellow/blue/g' white.dat red.dat black.dat
上述命令执行时 , sedsedsed
符串的替换。
依 white.dat、red.dat、black.dat 顺序 , 执行编辑指令 s/yellow/blue/(请参照[section 4.1] , 进行字
2.5.2.5.2.5.
执行输出的控制
在命令列上的选项 -n (批注[7]) 表示输出由编辑指令控制。由前章内容得知 , sedsedsed
会 "自动的" 将数据由 pattern
这 "自动的" 的动作改成 "被动的" 由它所执行的编辑指令(批注
space 输送到标准输出檔。但借着选项 -n , 可将 sedsedsed
[8])来决定结果是否输出。
由上述可知 , 选项 -n 必须与编辑指令一起配合 , 否则无法获得结果。例如 , 印出 white.dat 文件内含有 "white" 字
符串的数据行 , 其命令如下:
sedsedsed
-n -e '/white/p' white.dat
上面命令中 , 选项 -n 与编辑指令 /white/p (参照[section4.6]) 一起配合控制输出。其中 , 选项 -n 将输出控制权移给编
辑指令;/white/p 将数据行中含有 "white" 字符串印出屏幕。
3.3.3.
范例范例范例
一般在实际使用编辑器的过程中 , 常需要执行替换文件中的字符串、搬移、删除、与搜寻数据行等等动作。当然 , 一
般交谈式编辑器(如 vi、emacs)都能做得到上述功能 , 但文件一旦有大量上述编辑需求时 , 则用它们编辑十分没有效
率。本章将用举例的方式说明如何用 sedsedsed
自动执行这些编辑功能。此外 , 在本章范例中 , 均以下述方式描述檔的需求 :
将文件中...数据 , 执行...(动作)
如此 , 目的是为了能将它们迅速的转成编辑指令。其中 , " ...数据" 部份 , 转成指令中的位址参数表示 ; "执行...动作"
部份 , 则转成函数参数表示 。另外 , 当 "执行...动作" 要由数个函数参数表示时 , 则可利用 "{ "与 " }" 集合这些函
数参数(批注[9]) , 其指令形式如下 :
地址参数{
函数参数1
函数参数2
函数参数3
.
:
}
上述指令表示 , 将对符合地址参数的数据 , 依次执行函数参数1、函数参数2、函数参数3 ... 表示的动作。下面各节 , 分
别举例说明 sedsedsed
替换数据、移动、删除数据、及搜寻数据的命令。
3.13.13.1
替换文件中的数据
7
SedSedSed
-e '5c\
-e '/machine/s/phi/beta/g' input.dat(以后文件檔都以 input.dat 代表)
可替换文件中的字符串、数据行、甚至数据区。其中 , 表示替换字符串的指令中的函数参数为 s(参照[section4.1]);
表示替换数据行、或数据区的指令中的函数参数为 c(参照[section4.5])。上述情况以下面三个例子说明。上述情况以下面
三个例子说明。
例一. 将文件中含 "machine" 字符串的数据行中的 "phi" 字符串 , 替换成为 "beta" 字符串。其命令列如下 :
sedsedsed
例二. 将文件中第 5 行数据 , 替换成句子 "Those who in quarrels interpose, must often wipe a bloody nose."。其命令列如
下
sedsedsed
Those must often wipe a bloody nose.
' input.dat
例三. 将文件中 1 至 100 行的资料区 , 替换成如下两行资料 :
How are you?
data be deleted!
则其命令列如下
sedsedsed
-e '1,100c\
How are you?\
data be deleted!
' input.dat
3.23.23.2
搬动文件中的数据
使用者可用 sedsedsed
中的 hold space 暂存编辑中的数据、用函数参数 w(参照[section4.9])将文件数据搬动到它文件内储
用来暂存 pattern space 内数据的缓存
执行函数参数 h、H(参照[section4.19])时 , 会将 pattern space 资料暂存到 hold space;当执行函数参数 x、g、
存、或用函数参数 r(参照[section4.8])将它檔内容搬到文件内。Hold space 是 sedsedsed
器 , 当 sedsedsed
G(参照[section4.22])时 , 会将暂存的资料取到 pattern space 。下面举三个例子说明。
例一. 将文件中的前 100 数据 , 搬到文件中第 300 后输出。其命令列如下 :
sedsedsed
-f mov.scr 文件檔
mov.scr 檔的内容为
1,100{
H
d
}
300G
其中 ,
1,100{
H
d
}
它表示将文件中的前 100 数据 , 先储存(参照[section4.19])在 hold space 之后删除 ;指令 300G (参照[section4.22]) 表
示 , 将 hold space 内的资料 , 添加在文件中的第 300 数据后输出。
8