分享
 
 
 

通过几个例子看sed的模式空间与保持空间

王朝other·作者佚名  2008-05-18
窄屏简体版  字體: |||超大  

这是自己好久以前在ChinaUnix上原创的一贴,后来颇为精华贴,一直有点沾沾自喜,呵呵,再次贴在这里,鼓励鼓励自己

近来看到几个不是很常见,但是比较有用的sed例子,都和hold space与pattern space有关,于是对几个例子做了自己认为正确的解释,贴出来与大家共享并请指正,继续讨论

例子一

sed G

在文件每一行下面输出一个空行

代码:

$ cat foo

11111111111111

22222222222222

33333333333333

44444444444444

55555555555555

$ sed G foo

11111111111111

22222222222222

33333333333333

44444444444444

55555555555555

解释:

sed 中 G 的用法

The G function appends the contents of the holding area to the contents of the pattern space. The former and new contents are separated by a newline. The maximum number of addresses is two.

hold space : 保持空间(或者叫保留空间、缓冲区),初始为空

pattern space :模式空间

在上面的例子中,将为空的hold space附加到文件的每一行后面,所以结果是每一行后面多了一个空行

引申出:

sed '/^$/d;G'

在文件的每一个非空行下面输出一个空行

sed '/^$/d;G;G'

在文件的每一个非空行下面输出两个空行

代码:

$ cat foo

11111111111111

22222222222222

33333333333333

44444444444444

55555555555555

$ sed '/^$/d;G' foo

11111111111111

22222222222222

33333333333333

44444444444444

55555555555555

注:有时会有一些由空格符或者TAB组成的空行,前面的正则式 ^$ 就不能匹配到这样的行,则可以这样

sed '/[[:space:]]/d;G'

例子二

sed '/regex/{x;p;x;}'

在匹配regex的所有行前面插入一个空行

代码:

$ cat foo

11111111111111

22222222222222

test33333333333333

44444444444444

55555555555555

$ sed '/test/{x;p;x;}' foo

11111111111111

22222222222222

test33333333333333

44444444444444

55555555555555

解释:

sed 中 x 的用法

The exchange function interchanges the contents of the pattern space and the holding area. The maximum number of addresses is two.

即交换保持空间hold space和模式空间pattern space的内容

sed 中 p 的作用是把模式空间复制到标准输出。

分析一下该命令执行过程中保持空间和模式空间的内容

命令 保持空间 模式空间

x 执行前:null 执行后:test\n 执行前:test\n 执行后:null

p 执行前:null 执行后:test\n 执行前:test\n 执行后:null 输出一个空行

x 执行前:test\n 执行后:null 执行前:null 执行后:test\n

(注:把test所在的行简写为test了)

引申:

可以试验一下 sed '/test/{x;p;}' foo 或者 sed '/test/{p;x;}' foo 等,看看结果,体会两个空间的变化

相应的:

sed '/regex/G' 是在匹配regex的所有行下面输出一个空行

sed '/regex/{x;p;x;G;}' 是在匹配regex的所有行前面和下面都输出一个空行

例子三

sed 'n;G;'

在文件的偶数行下面插入一个空行

代码:

$ cat foo

11111111111111

22222222222222

33333333333333

44444444444444

55555555555555

$ sed 'n;G;' foo

11111111111111

22222222222222

33333333333333

44444444444444

55555555555555

解释:

sed 中 n 的用法:将模式空间拷贝于标准输出。用输入的下一行替换模式空间。

执行 n 以后将第一行输出到标准输出以后,然后第二行进入模式空间,根据前面对 G 的解释,会在第二行后面插入一个空行,然后输出;再执行 n 将第三行输出到标准输出,然后第四行进入模式空间,并插入空行,依此类推

相应的:

sed 'n;n;G' 表示在文件的第 3,6,9,12,... 行后面插入一个空行

sed 'n;n;n;G' 表示在文件的第 4,8,12,16,... 行后面插入一个空行

sed 'n;d' 表示删除文件的偶数行

例子四

sed '$!N;$!D'

输出文件最后2行,相当于 tail -2 foo

代码:

$ cat foo

11111111111111

22222222222222

33333333333333

44444444444444

55555555555555

$ sed '$!N;$!D' foo

44444444444444

55555555555555

解释:

D 删除模式空间内第一个 newline 字母 \n 前的资料。

N 把输入的下一行添加到模式空间中。

sed '$!N;$!D' : 对文件倒数第二行以前的行来说,N 将当前行的下一行放到模式空间中以后,D 就将模式空间的内容删除了;到倒数第二行的时候,将最后一行附加到倒数第二行下面,然后最后一行不执行 D ,所以文件的最后两行都保存下来了。

还有 N 的另外一种用法

代码:

$ sed = foo | sed N

1

11111111111111

2

22222222222222

3

33333333333333

4

44444444444444

5

55555555555555

$ sed = foo | sed 'N;s/\n/ /'

1 11111111111111

2 22222222222222

3 33333333333333

4 44444444444444

5 55555555555555

解释:

N 的作用是加上行号,可以用于格式化输出文件

例子五

sed '1!G;h;$!d'

sed -n '1!G;h;$p'

将文件的行反序显示,相当于 tac 命令(有些平台没有这个命令)

代码:

$ cat foo

11111111111111

22222222222222

33333333333333

$ sed '1!G;h;$!d' foo

33333333333333

22222222222222

11111111111111

$ sed -n '1!G;h;$p' foo

33333333333333

22222222222222

11111111111111

解释:

sed 中 h 用法:h

The h (hold) function copies the contents of the pattern space into a holding area, destroying any previous contents of the holding area.

意思是将模式空间的内容保存到保持空间中去

sed 中的 d 表示删除模式空间。

1!G表示除了第一行以外,其余行都执行G命令;$!d表示除了最后一行以外,其余行都执行d命令。

看一下sed '1!G;h;$!d'命令执行过程中保持空间与模式空间的变化:

命令 保持空间 模式空间

第一行 h;d 执行前:null 执行后:1111\n 执行前:1111\n 执行后:null

第二行 G;h;d 执行前:1111 执行后:2222\n1111\n 执行前:2222\n 执行后:null

第二行 G;h 执行前:2222\1111\n 执行后:3333\n2222\n\1111\n 执行前:3333\n 执行后:3333\n2222\n\1111\n

(注:把各个行简写了)

这样输出以后就是文件的反序了。

题外话:在vi中对一个文件进行反序显示的命令是 :g/./m0 , 意思是按照文件正常顺序每找到一行,就把该行放到文件的最上面一行去,这样循环一下正好把文件的行反序显示了。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
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- 王朝網路 版權所有