sed -- command function

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.../(xyzabc 代表某些字符) 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 替换成 C1C1 替换成 B1B1 替换成 A1input.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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值