zj@zj:~/Script/blog_script$ cat test1
1
2
3
4
合并上下两行
zj@zj:~/Script/blog_script$ sed '$!N;s/ / /' test1
1 2
3 4
合并匹配模式及其下一行
zj@zj:~/Script/blog_script$ sed '/2/{N;s/ / /}' test1
1
2 3
4
合并所有行
zj@zj:~/Script/blog_script$ sed ':a;N;s/ / /;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/([^ ]*) (.*) (.*)/3 2 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;/[^ ]*baidu[^ ]* [^ ]*microsoft[^ ]*$/{s/([^ ]*baidu[^ ]*) (.*)/2 1/};s/([^ ]*) (.*) (.*)/3 2 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;/[^ ]*baidu[^ ]* [^ ]*google[^ ]*$/{s/([^ ]*baidu[^ ]*) (.*)/2 1/;};s/([^ ]*) (.*) (.*)/3 2 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.
/[^ ]*baidu[^ ]* [^ ]*google[^ ]*$/这个就是说如果哦baidu与google之间只有一个 ,即这两个是连续行就:{s/([^ ]*baidu[^ ]*) (.*)/2 1/;}交换这两行
如果不匹配上面的模式就是说不是连续行了.
s/([^ ]*) (.*) (.*)/3 2 1/}
而在匹配连续行的情况下是不可能匹配上面表达式的.ok~~~~
3.忘了还有交互奇偶行
zj@zj:~/Script/blog_script$ sed '$!N;s/([^ ]*) ([^ ]*)/2 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;/^ *$/D}' test2
1
2
3
4
合并上下两行
zj@zj:~/Script/blog_script$ sed '$!N;s/ / /' test1
1 2
3 4
合并匹配模式及其下一行
zj@zj:~/Script/blog_script$ sed '/2/{N;s/ / /}' test1
1
2 3
4
合并所有行
zj@zj:~/Script/blog_script$ sed ':a;N;s/ / /;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/([^ ]*) (.*) (.*)/3 2 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;/[^ ]*baidu[^ ]* [^ ]*microsoft[^ ]*$/{s/([^ ]*baidu[^ ]*) (.*)/2 1/};s/([^ ]*) (.*) (.*)/3 2 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;/[^ ]*baidu[^ ]* [^ ]*google[^ ]*$/{s/([^ ]*baidu[^ ]*) (.*)/2 1/;};s/([^ ]*) (.*) (.*)/3 2 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.
/[^ ]*baidu[^ ]* [^ ]*google[^ ]*$/这个就是说如果哦baidu与google之间只有一个 ,即这两个是连续行就:{s/([^ ]*baidu[^ ]*) (.*)/2 1/;}交换这两行
如果不匹配上面的模式就是说不是连续行了.
s/([^ ]*) (.*) (.*)/3 2 1/}
而在匹配连续行的情况下是不可能匹配上面表达式的.ok~~~~
3.忘了还有交互奇偶行
zj@zj:~/Script/blog_script$ sed '$!N;s/([^ ]*) ([^ ]*)/2 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;/^ *$/D}' test2