博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
sed行处理详解(交换行,合并行,删除行等)
阅读量:5094 次
发布时间:2019-06-13

本文共 3655 字,大约阅读时间需要 12 分钟。

1.合并行

zj@zj:~/Script/blog_script$ cat test1
1
2
3
4
合并上下两行
zj@zj:~/Script/blog_script$ sed '$!N;s/\n/\t/' test1
1    2
3    4
合并匹配模式及其下一行
zj@zj:~/Script/blog_script$ sed '/2/{N;s/\n/\t/}' test1
1
2    3
4
合并所有行
zj@zj:~/Script/blog_script$ sed ':a;N;s/\n/\t/;ba;' test1
1    2    3    4
2.交换行
2.1已知行号时交换两行
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
2.2不知道行号
要交换的两行是连续行的情况下:
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~~~~
3.忘了还有交互奇偶行
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
4.删除行就不用说了吧
d喽....
5.删除空行
sed '/^$/d' test2
删除多个空行为一个空行
sed '/^$/{N;/^\n*$/D}' test2
 
转载自:http://blog.chinaunix.net/uid-9950859-id-98222.html
 

附:sed的合并行的方法

处理前:
114.113.144.2:
19ms
19ms
19ms
36ms
22ms
19ms
18ms
218.61.204.73:
0ms
0ms
0ms
0ms
0ms
0ms
0ms
处理后:
114.113.144.2: 19ms 19ms 19ms 36ms 22ms 19ms 18ms
218.61.204.73: 0ms 0ms 0ms 0ms 0ms 0ms 0ms
 
解决方法(稍有改动):
1.
awk 'NR>1&&!/ms/{print ""}{printf $0" "}END{print ""}' file
解释:行号大于1且没有匹配到ms就换行,把每一行都打印出来,用空格隔开,最后,换行。
 
2.
sed ':a;$!N;/ms$/s/\n/ /;ta;P;D' file
解释:设置一个标签a,除了最后一行,其他行都执行把下一行的数据添加到模式空间,当匹配到以ms结尾的行就把换行符换成空格,如果替换成功,就重复执行a否则就将模式空间的第一行打印出来,然后删除模式空间的第一行,开始下一个循环。
重点解释一下P和D:
P:打印模式空间的第一行。
D:删除模式空间的第一行,开始一个新的循环。
这个命令第一次打印前的模式空间的内容是:
114.113.144.2: 19ms 19ms 19ms 36ms 22ms 19ms 18ms
218.61.204.73:
通过P命令,sed就会把第一行打印出来,然后再通过D命令,把第一行删掉,然后第二行就变成第一行了。此时模式空间的内容就是:
218.61.204.73:
 
3.
cat file | xargs -n8
 
4.
paste -sd '       \n' file
-s:将一个文件的数据每次都水平地输出。
-d '       \n':将默认分隔符Tab换成7个空格和1个换行符,即前8个数据用空格隔开,然后换行。
 
5.
sed -e :a -e '$!N;/\n.*ms/{s/\n/ /;ta};P;D' file
解释:我不知道写这命令的人为什么要用-e,其实直接用
sed ':a;$!N;/\n.*ms/s/\n/ /;ta;P;D' file不是更好?这个命令跟第2个命令是一样。
 
6.
sed -n '/^.*[.]/{:m;N;/\n.*[.]/!{s/\n/ /;bm};P} file
解释:这个命令的运行结果是:
114.113.144.2: 19ms 19ms 19ms 36ms 22ms 19ms 18ms
只有一行,所以肯定有问题,经我改过之后是这样的:sed '/^.*[.]/{:m;N;/\n.*[.]/!{s/\n/ /;bm};P;D} file,方法跟第2个命令是一样的,只是把简单问题复杂化了。

转载于:https://www.cnblogs.com/jjzd/p/6892891.html

你可能感兴趣的文章
并发编程 线程
查看>>
Mysql 解压安装
查看>>
Mysql
查看>>
前端html
查看>>
网络编程
查看>>
.Net Core项目发布到虚拟机(三)
查看>>
关于“设计模式”和“设计程序语言”的一些闲话
查看>>
(一二九)获取文件的MineType、利用SSZipArchive进行压缩解压
查看>>
python学习4 常用内置模块
查看>>
Window7上搭建symfony开发环境(PEAR)
查看>>
ResolveUrl的用法
查看>>
Linux内核态、用户态简介与IntelCPU特权级别--Ring0-3
查看>>
第23月第24天 git命令 .git-credentials git rm --cached git stash clear
查看>>
GitHub开源:升讯威ADO.NET增强组件 sheng.ADO.NET.Plus V1.3
查看>>
华为离职副总裁徐家骏:年薪千万的工作感悟
查看>>
java SE :标准输入/输出
查看>>
vs 打开项目时要建配置文件的解决办法
查看>>
sublimie 知乎
查看>>
three.js 入门案例
查看>>
一些方便系统诊断的bash函数
查看>>