linux sed 空间模式,sed的模式空间和保持空间

sed之所以能以行为单位的编辑或修改文本,其原因在于它使用了两个空间:一个是活动的“模式空间(pattern space)”,另一个是起辅助作用的“保持空间(hold space)这2个空间的使用。

模式空间:可以想成工程里面的流水线,数据之间在它上面进行处理。

保持空间:可以想象成仓库,我们在进行数据处理的时候,作为数据的暂存区域。

正常情况下,如果不显示使用某些高级命令,保持空间不会使用到!

sed在正常情况下,将处理的行读入模式空间,脚本中的“sed command(sed命令)”就一条接着一条进行处理,直到脚本执行完毕。然后该行被输出,模式被清空;接着,在重复执行刚才的动作,文件中的新的一行被读入,直到文件处理完毕。

9d7a29c8ca538aa661946e22c1398e2a.png

一般情况下,数据的处理只使用模式空间(pattern space),按照如上的逻辑即可完成主要任务。但是某些时候,通过使用保持空间(hold space),还可以带来意想不到的效果。

sed命令:

+ g:[address[,address]]g 将hold space中的内容拷贝到pattern space中,原来pattern space里的内容清除。

+ G:[address[,address]]G 将hold space中的内容append到pattern space\n后。

+ h:[address[,address]]h 将pattern space中的内容拷贝到hold space中,原来的hold space里的内容被清除。

+ H:[address[,address]]H 将pattern space中的内容append到hold space\n后。

+ d:[address[,address]]d 删除pattern中的所有行,并读入下一新行到pattern中。

+ D:[address[,address]]D 删除multiline pattern中的第一行,不读入下一行。

+ x:交换保持空间和模式空间的内容。

1. 给每行结尾添加一行空行

b9190c4b2bc1f9102fda46ebfd98cb27.png

2.用sed模拟出tac的功能(倒序输出)

87303c0894690fbd81cc4237ba2b6353.png

1!G:第1行不执行“G”命令,从第2行开始执行。$!d:最后一行不删除(保留最后1行)。

3.追加匹配行到文件结尾

705758de5bc635393cbc150b8ab2bf54.png

-e :进行多项编辑,即对输入行应用多条sed命令时使用

4.行列转化

5112133881008becc84d12a91194139b.png

-n :取消默认的输出

H表示把pattern space 的内容追加到hold space中去,H可以带一个地址,这里用的是$,表示到文件的末尾,然后用x将之取到pattern space中,把\n替换成空格再打印即可。

5. 行列转化,求1~100的求和

c6963a5869b48f5810401f1daaba9de3.png

seq 100 ==>竖排打印1...100个数字。

bc    ==>交给bc计算

附:seq命令的语法

1)生成序列[1…LAST]

例:seq 5 表示序列为 1 2 3 4 5

a4f67d2ed21029f52b7c14e3bd233a01.png

2)生成序列[FIRST…LAST],步长为1

例:seq 2 5表示序列为  2 3 4 5

1bea12d9bfffae1879162ac64cf98236.png

3)生成序列[FIRST…LAST],步长为INCREMENT

例:seq 2 2 5表示序列为  2 4

8da9b934ef06e551e89a5a13330061ab.png

6. 打印奇偶数行

d68e9dd02ecb93fa4809fbb524716e4b.png

42777583244bbb1c550f028aa59831c0.png

附:awk打印奇偶行

方法一:

31c007fbd622e83ab50eae0ecd51b4ef.png

NR是行号,awk的内建函数,当第一行,NR==1时,对2取余,结果是1,在awk的执行模式里,这个1就是pattern,为真,执行默认的{print},这个action操作。那么打印出该行,到第2行则余数是0,pattern为0,则为假,不会执行默认的{print},则不会输出偶数行。就达到了只输出奇数行的效果,反之则输出偶数行了。

方法二:

345c4cb2c6a8c9e905bad24c1d22bbe0.png

这行命令充分的利用了C语言中 ++i 与 i++ 的区别,i++ 中i的值自加一次后这个表达式的结果等于1,但此时i的值仍然为0,i的值在当前表达式中不会改变,++i中i的值自加一次后,i的值是1。第一行时,因为对2取余的时候 i++ 自加一次后的值是1,但 i++ 是把i的自加前的值去对2取余的,0对2取余结果为0,条件为假,到第二行的时候i的值才是上次自加后的值为1,对2取余数为1,pattern为真,则输出第2行,以此类推。++i 则是自加后i的值是1,所以输出的奇数行。

方法三:

391dfe4ae2ac589cbff99a1a8db97d70.png

方法四:

10aa69483739e64f0f4e8b3ee224e62c.png

awk里面有三个built-in function,分别是:and(a, b)按位与,or(a, b)按位或,xor(a, b)按位异或,当FNR为1的时候,就是第一行,1的2进制为0001,与0001按位与,得到结果是0001,0001的结果为真,就打印改行,当FNR为2时二进制表示为0010,那么又与0001相与,结果为0000,条件为假,则不打印。只有当FNR为奇数时,二进制的尾数为1,与0001相与结果才为真,否则结果都为假。即只输出奇数行,非则输出偶数行。

7.求1~100和

3b34c4016ac8908a430e48dfc0c876b0.png

:a表示标签a,ba表示跳转到a标签,$表示最后一行,!表示不做后续操作,所以,$!ba表示最后一行不用跳转到a标签,结束此次操作。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值