sed行处理详解(交换行,合并行,删除行等)
生活随笔
收集整理的這篇文章主要介紹了
sed行处理详解(交换行,合并行,删除行等)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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
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
轉載于:https://www.cnblogs.com/huangmr0811/p/5570935.html
總結
以上是生活随笔為你收集整理的sed行处理详解(交换行,合并行,删除行等)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构--百度百科
- 下一篇: MySQL数据类型和运算符