分享
 
 
 

sed -- command function

王朝other·作者佚名  2006-01-31
窄屏简体版  字體: |||超大  

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有