sed刪除前N個字符

vim sed刪除前N個字符 刪除空行等 [轉]
2009-12-04 13:11

blog.chinaunix.net/u2/76292/showart_1210882.html
blog.chinaunix.net/u1/46039/showart_373817.html


>>>>sed
刪除前N個字符 
sed -i 's/^..//' file    (N個.表示N個字符)

sed s/[[:space:]]//g  filename          刪除空格

sed /^$/d         filename        刪除空行

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


>>>>vim
刪除前N個字符
步驟:
vi file
按shift :
然後輸入g/../s///
回車!

:%s/^..//

:%s#^..##g

vim aaaaa.txt

按ctrl+v進入列模式

按向下方向鍵選擇要刪除的列。
按向右方向鍵選擇要刪除的字符(2下則刪除2個字符)


x刪除

esc退出
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章