1.# 在 script file 内,函数参数 # 后的文字为注解。当注解文字超过多行时,其行间须以 "\" 换行字符相隔。
2.! 函数参数 ! 表示仅对指定地址不执行函数参数。指令:[address1[,address2]] ! 函数参数
例如删除,除了含 "1996" 字符串,所有资料行,则执行命令:sed -e '/1996/!d' input.dat
3.= 函数参数 = 表示印出数据的行数。指令:[address1 ,[address2]] =
说明:函数参数 = 最多配合两个地址参数。 执行时,行数将在资料输出前先输出,即在每一行前面另加一行,并且显示行号,而不是直接在行首加序号。
范例:印出 input.dat 文件内资料行数。假设 input.dat 的内容如下:
The UNIX
Operating System
用函数参数 = 来印出数据的行数,sed 命令列如下: sed -e '=' input.dat
4.a\ 函数参数 a 表示将资料添加到文件中。指令:[address1] a\ 使用者所输入的资料
说明:函数参数 a 最多与一个地址参数配合。
函数参数 a 紧接着 "\" 字符用来表示此行结束,使用者所输入的资料必须从下一行输入。如果资料超过一行,则须在每行的结尾加入"\"。
sed 执行添加动作情况如下:当 pattern space 内资料输出后,sed 跟着输出使用者所输入的资料。
例:题目:添加 "多任务操作系统" 在含 "UNIX" 字符串的数据行后。假设 input.dat 档的内容如下:
UNIX
说明:用函数参数 a 将所输入的数据添加在含 "UNIX" 字符串的数据行后。
sed 命令列如下:sed -e '/UNIX/a\ 多任务操作系统' input.dat
5.i\ 函数参数 i 表示将资料插入文件中。指令:[address1] i\ 使用者所输入的资料
说明:函数参数 i 最多与一个地址参数配合。
函数参数 i 紧接着 "\" 字符用来表示此行结束,使用者所输入的资料必须从下一行输入。如果资料超过一行,则须在每行的结尾加入"\"。
sed 执行插入动作的情况如下:在 pattern space 内资料输出前,sed 先输出使用者所输入的资料。
范例:
将 "文章版权属于中央研究院" 插在 input.dat 檔中含 "院长 : 李远哲" 的资料行之前。假设 input.dat 档内容如下:
院长 : 李远哲
说明: 用函数参数 i 将资料行 "文章版权属于中央研究院" 插在含 "院长 : 李远哲" 的资料行之前。
sed 命令列如下:sed -e '/院长 : 李远哲/i\ 文章版权属于中央研究院' input.dat
6.c\ 函数参数 c 表示改变文件中的资料。指令:[address1[ ,address2]]c\ 使用者所输入的资料
说明:
函数参数 c 最多与两个地址参数配合。
函数参数 c 紧接着 "\" 字符用来表示此行结束,使用者所输入的资料必须从下一行输入。如果资料超过一行,则须在每行的结尾加入"\"。
sed 执行改变动作的情况:在 pattern space 内资料输出时,sed 改变它成为使用者所输入的资料。
7.d函数参数 d 表示删除模式空间的资料,开始下一个循环。指令: [address1[ ,address2]] d
说明:函数参数 d 最多与两个地址参数配合。
sed 执行删除动作情况如下:将 pattern space 内符合地址参数的资料删除,将下一笔资料读进 pattern space ,重新执行 sed script。
8.D 函数参数D表示删除pattern space内的第一行资料(包括 \n ) 。如果仍然有数据在模式空间,则不从输入读取数据(也不输出),接着下一个循环。
指令:[address1[,address2]]D
说明:函数参数 D 最多配合两个地址参数。
函数参数 D 与 d 的比较如下:
当 pattern space 内只有一资料行时,D 与 d 作用相同。
当 pattern space 内有多行资料行时
D 表示只删除 pattern space 内第一行资料; d 则全删除。
D 表示执行删除后,pattern space 内不添加下一笔资料,而将剩下的资料重新执行 sed script; d 则读入下一行后执行 sed script。
9.s 函数参数 s 表示替换(substitute)文件内字符串。指令:[address1[,address2]] s/pattern/replacement/[flag]
说明:函数参数 s 最多与两个地址参数配合。
关于 "s/pattern/replacement/[flag]"有下面几点说明:
pattern:它为 reguler expression 字符串。它表示文件中要被替换的字符串。
replacement:它为一般字符串。但其内出现下列字符有特别意义:
&:代表其前 pattern 字符串。例如:sed -e 's/test/& my car/' 资料文件名
指令中,& 代表 pattern 字符串 "test"。故执行后,资料文件的 "test" 被替换成 "test my car"。
\n :代表 pattern 中被第 n 个 \( 、\)所括起来的字符串。例如:sed -e 's/\(test\) \(my\) \(car\)/[\2 \3 \1]/' 资料文件名
指令中 , \1 表示 "test"、\2 表示 "my"、\1 表示 "car" 字符串。故执行后 , 资料文件的 "test my car" 被替换成 "[my car test]"。
\ :可用它来还原一些特殊符号(如上述的 & 与 \ )本身字面上的意义,或用它来代表换行。
flag :主要用它来控制一些替换情况:
当 flag 为 g 时,代表替换所有符合(match)的字符串 。
当 flag 为十进制数 m 时,代表替换行内第 m 个符合的字符串。
当 flag 为 p 时,代表替换第一个符合 pattern 的字符串后,将资料输出标准输出文件。
当 flag 为 w wfile 时,代表替换第一个符合 pattern 的字符串后,输出到 wfile 档内(如果 wfile 不存在,则会重新开启名为 wfile 的档案)。
当没有 flag 时,则将数据行内第一个符合 pattern 的字符串以 replacement 字符串来替换 。
delimiter :在 "/pattern/replace/[flag] " 中 "/" 被当成一 delimiter。除了空白(blank)、换行(newline) 之外,使用者可用任何字符作为 delimiter。例如编辑指令:s#/usr#/usr1#g
上述命令中使用 # 为 delimiter。如果用 "/" 做 delimiter,则 sed 会将 pattern 与 replacement 中的 "/" 当成 delimiter 而发生错误。
例:替换 input.dat 档(后面如果没有特别指定,均假设文件档名为 input.dat)内 "1996" 字符串成 "1997",同时将这些资料行存入 year97.dat 档内: sed -e 's/1996/1997/w year97.dat' input.dat
10.y 函数参数 y 表示转换数据中的字符。指令: [address1[ ,address2]]y /abc.../xyz.../
函数参数y是一个管局命令,最多配合两个地址参数,拒绝使用后缀flag/g ,/abc.../xyz.../(x、y、z、a、b、c 代表某些字符) 为 y 的 argument ,其中 abc... 与 xyz... 的字符个数必须相同。 转换时,将 pattern space 内数据内的 a 字符转换成 x 字符 、b 字符转换成 y 字符 、c 字符转换成 z 字符 ...。
例:利用函数参数 y 指示 sed 做字母大小的转换,sed 命令列如下:
sed -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' input.dat
11.n 函数参数 n 表示读入下一行数据。指令:[address1[,address2]] n
说明:函数参数 n 最多配合两个地址参数。其执行作的情况如下:输出在 pattern space 的资料,将下一笔资料读到 pattern space,执行下一个编辑指令。
例:输出 input.dat 文件内偶数行资料。假设 input.dat 档内容如下:
The
UNIX
Operation
System
说明:在命令列上以选项 -n,将数据输出的控制权转给指令;利用函数参数 n 将下一行数据(偶数行)取代 pattern space 内的资料行(奇数行);利用函数参数 p 将 pattern space 内的数据(偶数行)输出。
sed 命令列如下:sed -n -e 'n' -e 'p' input.dat
12.N 函数参数 N 表示添加下一行数据到 pattern space 内,添加的时候会自动在原行末尾加上”\n”。
指令:[address1[,address2]] N
说明:函数参数 N 最多配合两个地址参数。sed 执行时,将下一行资料读入并添加在 pattern space 内,数据行间以换行字符(embedded newline character)分隔。此外,在替换时,换行字符可用 \n 来 match。
范例:将下述两行资料合并。假设 input.dat 的内容如下:
The UNIX
Operating System
说明:先利用函数参数 N 将两行数据置于 pattern space 内,在利用函数参数 s/\n/ / 将两行数据间的分隔号 \n 以空白替代,如此两行资料变成一行输出。
sed 命令列如下: sed -e 'N' -e 's/\n/ /' input.dat
13.p 函数参数 p 表示印出当前模式空间的内容。指令:[address1[,address2]] p
说明:函数参数 p 最多与两个地址参数配合。 sed 拷备一份 pattern space 内容至标准输出档。
14.P 函数参数 P 表示印出 pattern space 内的第一行(第一个 newline 字母 \ 前)的资料。
指令:[address1,address2] P
说明:函数参数 P 最多配合两个地址参数。
P 与 p,除了面对的 pattern space 内的资料行数不同外,其它均相同。
范例:输出 input.dat 文件内奇数行资料。假设 input.dat 档内容如下:
The
UNIX
System
sed 命令列:sed -n -e 'N' -e 'P' input.dat
说明:在命令列上以选项 -n,将数据输出的控制权转给指令,利用函数参数 N 将偶数行添加至 pattern space 内奇数行后,利用函数参数 P 将 pattern space 内的第一行(奇数行)输出,在奇数行输出后,pattern space 内剩下的资料行(偶数行)则被放弃输出,最后,整个输出只有原先的奇数行资料。
15.l 函数参数 l,除可将数据中的 nonprinting character 以 ASCII码列出外,其于均与函数参数 p 相同。例如,将下面 input.dat 檔中的 ^[ 以 ASCII 码印出: The Great ^[ is a movie starring Steve McQueen.
执行命令:sed -e 'l' input.dat
输出如下(上述第二行资料为 sed 的自动输出。):
The Great \003 is a movie starring Steve McQueen.
The Great is a movie starring Steve McQueen.
16.h 函数参数 h 表示暂存 pattern space 的数据至 hold space。指令:[address1,[address2]] h
说明:函数参数 h 最多配合两个地址参数,sed 执行暂存动作时,会盖掉(overwrite) hold space 内原来的资料,当 sed 全部执行结束时,hold space 内资料会自动清除。
17.H 函数参数 H 与 h 唯一差别是,sed 执行 h 时,资料盖掉(overwrite) hold space 内原来的资料,而 H,资料则是 "添加(append)" 在 hold space 原来资料后,添加的时候会自动在原行末尾加上”\n”。
18.g 将 hold space 内资料放回 pattern space 内(与函数参数 h 相反的动作)。其指令格式如下:[address1,address2]g
函数参数 g 最多配合两个地址参数,sed 执行放回动作时,资料盖掉(overwrite) pattern space 内原来的资料。
19.G 函数参数 G 与 g 唯一差别是,sed 执行 g 时,资料盖掉(overwrite) pattern space 内原来的资料,而 G,资料则是 "添加(append)" 在 pattern space 原来资料后,添加的时候会自动在原行末尾加上”\n”。
20.x 函数参数 x 表示交换 hold space 与 pattern space 内的资料。指令格式:[address1[,address2]] x
函数参数 x 一般与其它处理 hold space 的函数参数一起配合使用。
例如,将 input.dat 文件内第 1 行资料取代第 3 行资料。
此时,用函数参数 h 与 x 来配合。其中,以函数参数 h 将第 1 数据存入 hold space ; 当第 3 行数据出现在 pattern space,以函数参数 x 交换 hold space 与 pattern space 的内容。如此,第 3 行资料就被第 1 资料替代。
命令如下:sed -e '1h' -e '3x' input.dat
21.r函数参数 r 表示读入它档案内容到文件中。指令:[address1] r 它档名称
说明:函数参数 r 最多与一个地址参数配合。 在指令中,函数参数 r 与它档名称间,只能有一空格。
sed 执行读入动作的情况如下:在 pattern space 内资料输出后,sed 读出它档的内容跟着输出。当它档不存在时,sed 照样执行其它指令而不会有任何错误讯息产生。
22.w 函数参数 w 表示将文件中的写到它档内。指令:[address1[,address2]] w 它档名称
说明:
函数参数 w 最多与两个地址参数配合。
在指令中,函数参数 w 与它档名称间,只能有一空格。
sed 执行写出动作的情况如:将 pattern space 内资料写到它文件内。资料写入时,会取代(overwrite)原来档案内的资料。另外,当它档不存在时,sed 会重新产生(creat)它。
23.: label函数参数“:”与函数参数“b”可在 sed script 内建立类似 BASIC 语言中 GOTO 指令的功能。
其中,函数参数“: label”建立 script file 内指令互相参考的位置。
24.b label函数参数b label 将执行的指令跳至由 : 建立的标记位置,如果标记不存就分支到脚本的末尾。
函数参数 : 与 b,在 script file 内配合的情况如下
编辑指令m1
:记号
编辑指令m2
……
[address1,[address2]]b [记号]
其中,当 sed 执行至指令 [address1,[address2]]b [记号] 时,如 pattern space 内的资料符合地址参数,则 sed 将下一个执行的位置
branch 至由 :记号设定的标记处,也就是再由 "编辑指令m2" ... 执行。另外,如果指令中函数参数 b 后没有记号,则 sed 将下一个执行的指令
branch 到 script file 的最后,利用此可使 sed script 内有类似 C 语言中的 case statement 结构。
例:将 input.dat 文件内资料行的开头字母重复印 40 次。假设 input.dat 档的内容如下 :
A
B
C
说明: 用指令 b p1 与 :p1 构成执行增加字母的循环(loop),同时在字母出现 40 个时,也用指令 b 来跳出循环。下面就以文件内第一行资料 "A" 为例,描述它如何连续多添加 39 个 "A" 在同一行:
用指令 s/A/AA/(参照 section4.1)将 "A" 替换成 "AA"。
用指令 b p1 与 :p1 构成循环(loop),它目的使上述动作被反复的执行。每执行一次循环,则资料行上的 "A" 就多出一个。例如,第一次循环资料行变成 "AA",第二次循环资料行变成 "AAA" ...。
用指令 [ABC]\{40\}/b来作为停止循环的条件。当数据行有连续 40 个 A 出现时,函数参数 b 将执行的指令跳到最后,停止对此行的编辑。
同样,对其它资料行也如同上述的方式执行。
sed 命令列如下:
sed -e '{
:p1
/A/ s/A/AA/
/B/ s/B/BB/
/C/ s/C/CC/
/[ABC]\{40\}/b
b p1
}' input.dat
25.t lable先执行一替换的编辑指令,如果替换成功则将编辑指令跳至 :label 处执行。
基本上,函数参数 t 与 函数参数 b 的功能类似,除了在执行 t 的
branch 前,会先去测试其前的替换指令有没有执行替换成功外。在 script file 内的情况如下:
编辑指令m1
:记号
编辑指令m2
.
.
.
s/.../.../
[address1,[address2]]t [记号]
编辑指令m3
其中,与函数参数 b 不同处在于,执行函数参数 t branch 时,会先检查其前一个替换指令成功与否。如成功,则执行
branch ;不成功,则不
branch,而继续执行下一个编辑指令,例如上面的编辑指令m3。
范例:将 input.dat 文件中资料 A1 替换成 C1、C1 替换成 B1、B1 替换成 A1。input.dat 档的内容如下:
B1
A1
B1
C1
A1
C1
说明:input.dat 文件中全部资料行只需要执行一次替换动作,但为避免资料被替换多次,所以利用函数参数 t 在 sed script 内形成一类似 C 语言中 case statement 结构,使每行资料替换一次后能立即用函数参数 t 跳离替换编辑。
sed 命令列 :
sed -e '{
s/A1/C1/
t
s/C1/B1/
t
s/B1/A1/
t
}' input.dat
26.{ } 集合有相同位置参数的指令。
27.q 函数参数 q 表示跳离 sed编辑 。指令:[address1] q
说明:函数参数 q 最多配合一个地址参数。sed 执行跳离动作时,它停止输入 pattern space 资料,同时停止资料送到标准输出文件。
例:对文件文件执行 script_file 内的编辑指令,除非遇到 "Linux" 字符串。
说明:无论 script_file 内是何种指令,使用者只要在命令列上用指令/Linux/q,函数参数 q 会强迫 sed 遇到 "Linux" 时做跳离动作。
sed 命令列如下:sed -e '/Linux/q' -f script_file input.dat