sed 处理交换行

用sed实现行的交换

已知行号时交换两行
zj@zj:~/Script/blog_script$ cat test
baidu music so terrible so bad
microsoft haha haha
yahoo byebye
google princess so good
这里是交换1,4行.当然你可以根据自己需要修改
zj@zj:~/Script/blog_script$ for(( i=1;i<=4;i++ )); do case $i in 1) sed -n 4p test;; 4) sed -n 1p test;; *) sed -n ${i}p test;; esac; done
google princess so good
microsoft haha haha
yahoo byebye
baidu music so terrible so bad
连续时好说:
zj@zj:~/Script/blog_script$ sed '1{h;d};2{G}' test
microsoft haha haha
baidu music so terrible so bad
yahoo byebye
google princess so good

不知道行号
要交换的两行是连续行的情况下:
zj@zj:~/Script/blog_script$ sed '/baidu/{h;d};/microsoft/{G}' test
microsoft haha haha
baidu music so terrible so bad
yahoo byebye
google princess so good
ps:交换包含bai与microsoft的行

两行不连续的情况:

zj@zj:~/Script/blog_script$ sed '/baidu/{:a;N;/google/!ba;s//([^/n]*/)/n/(.*/)/n/(.*/)//3/n/2/n/1/}' test
google princess so good
microsoft haha haha
yahoo byebye
baidu music so terrible so bad
ps:交换含有baidu与google的行

不论连续不连续的都可以的:
zj@zj:~/Script/blog_script$ sed '/baidu/{:a;N;/microsoft/!ba;/[^/n]*baidu[^/n]*/n[^/n]*microsoft[^/n]*$/{s//([^/n]*baidu[^/n]*/)/n/(.*/)//2/n/1/};s//([^/n]*/)/n/(.*/)/n/(.*/)//3/n/2/n/1/}' test
microsoft haha haha
baidu music so terrible so bad
yahoo byebye
google princess so good

zj@zj:~/Script/blog_script$ sed '/baidu/{:a;N;/google/!ba;/[^/n]*baidu[^/n]*/n[^/n]*google[^/n]*$/{s//([^/n]*baidu[^/n]*/)/n/(.*/)//2/n/1/;};s//([^/n]*/)/n/(.*/)/n/(.*/)//3/n/2/n/1/}' test
google princess so good
microsoft haha haha
yahoo byebye
baidu music so terrible so bad

ps:上面代码
/baidu/{....} 遇到含有baidu的行,开始做{}中的命令序列
:a;N;/google/!ba 循环读信息,直到读取google.
/[^/n]*baidu[^/n]*/n[^/n]*google[^/n]*$/这个就是说如果哦baidu与google之间只有一个/n,即这两个是连续行就:{s//([^/n]*baidu[^/n]*/)/n/(.*/)//2/n/1/;}交换这两行

如果不匹配上面的模式就是说不是连续行了.
s//([^/n]*/)/n/(.*/)/n/(.*/)//3/n/2/n/1/}
而在匹配连续行的情况下是不可能匹配上面表达式的.ok~~~~

交互奇偶行
zj@zj:~/Script/blog_script$ sed '$!N;s//([^/n]*/)/n/([^/n]*/)//2/n/1/' test
microsoft haha haha
baidu music so terrible so bad
google princess so good
yahoo byebye

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值