sed高级使用学习更新中。。。。。

 
原始文件:
# cat a.a  | cat -n
     1  1111111
     2  2222222
     3  test33333
     4  444444444444
     5  555555555555

G的用法:  追加保留空间内容到模式空间
另外g的用法:复制保留空间的内容到模式空间
  # sed 'G' a.a  | cat -n
     1  1111111
     2
     3  2222222
     4
     5  test33333
     6
     7  444444444444
     8
     9  555555555555
    10
解释:保留空间初始为空。模式空间读取第一行,保留空间将内容追加到模式空间去,就添加了一个空行;模式空间再读取第二行,保留空间将内容追加到模式空间中读取的第二行下面,依次类推。
 
p的用法: 把模式空间复制到标准输出
# sed 'G;p' a.a  | cat -n
     1  1111111
     2
     3  1111111
     4
     5  2222222
     6
     7  2222222
     8
     9  test33333
    10
    11  test33333
    12
    13  444444444444
    14
    15  444444444444
    16
    17  555555555555
    18
    19  555555555555
    20
解释:结合G,更好的理解下G的空间利用。
     模式空间初始为11111 ;执行G后,保留空间内容为空追加到模式空间1111下面 ,模式空间为2行,111111 和 保留空间的空行;输出 ;接着执行p ,将模式空间的2行再输出一遍。依次类推。
 
N的用法:读取新的输入行,将内容追加到模式空间去,开辟多行模式空间。n一次性读取模式空间,然后再读取下一行。
# sed 'N;p' a.a  
1111111
2222222
1111111
2222222
test33333
444444444444
test33333
444444444444
555555555555
解释:模式空间初始内容为11111111。执行N 后,读取22222222,并追加到模式空间111111下,模式空间就有11111111 和 2222222222;输出 ;执行p,再打印一遍模式空间。
 
D的用法: 个人理解为 删除模式空间新加入行前面的换行符之前的内容
# sed '$!N;$!D' a.a
444444444444
555555555555
解释:模式空间初始读取第一行111111;$!N 是非末行,将其添加到模式空间,第二行匹配,读取222222 ;$!D 是非末行,删除前面的内容,就将11111111删除,此时模式空间只有2222222了;一次读取第3、4行。当读取第4行,执行完条件后,模块空间只剩444444 ;最后一行,不匹配,保留,最后只剩下4和5行。
 
h的用法:将模式空间的内容复制到保持空间中去
另外H:将模式空间的内容追加到保持空间去
# sed '1!G;h;$!d' a.a 
555555555555
444444444444
test33333
2222222
1111111
解释: 模式空间起初为11111111 ;1!G,除第一行,其他行执行G,此时模式空间读入第二行;执行h,将22222和11111 复制到保持空间中 ;执行$!d,就是清除模式空间。接着读入第3行;执行1!G,将保留空间的内容追加到模式空间,现在模式空间为3333\n22222\n111111;执行h,将模式空间内容再复制到保持空间;执行$!d,清空保留空间。一次类推。
到读入第5行,将保留空间的内容追加到模式空间中去,模式空间为5555\n ...\n11111 ; 是最后一行,不匹配$!d,不执行。
 
x的用法:交换保持空间和模式空间的内容
# sed 'x;$!N;x' a.a
1111111
test33333
555555555555
解释:模式空间初始为11111;执行x,模式空间为空,保持空间为11111;执行$!N,读入22222;执行x,模式空间为111111,保持空间为22222;第一轮执行完毕,打印111。模式空间载入3333;执行x,模式空间为222222,保持空间为3333333;执行$!N,读入444444,模式空间为2222\n444444 ,保持空间不变;执行x,模式空间变为33333,保持空间变为2222\n4444;第二轮执行完毕,打印33333。模式空间载入5555555;执行x,模式空间为2222\n4444,保持空间为555555;$!N不匹配;执行x,模式空间为5555,保持空间为222\n444.
 
 
###########################
# cat a.a
1
2
3
4
5
6
7
1、打印基数行
# sed  -n  '1~2p'   a.a     从第一行开始,步数为2
1
3
5
7
2、打印偶数行
# sed  -n  '2~2p'  a.a    从第二行开始,步数为2
2
4
6
扩展:sed -n '2~3p' a.a  /     sed  -n '3~3p'  a.a
 
# cat a.a
1111111
2222222
test33333
444444444444
555555555555
# sed -n '1,+2p' a.a   \\打印从第1行开始,到"1+2"结束
1111111
2222222
test33333

你可能感兴趣的:(shell,正则,sed,sed,高级,高级)