聲明:
這些代碼只是為了學習和理解sed命令而為之,並不
代表問題的唯一解或最佳解,希望各位拍磚
參考資
料:<sed&awk.pdf>等
一. 替換
1.神奇變換(y
命令的使
用)
代碼:
|
| sed 'y/ori_letter_list/target_letter_list/' filename |
代碼:
|
cat filename 1234567890 2345678901 3456789012 4567890123 |
測試
將
檔案中1
換成A
將檔案中2
換成B
...
將檔案中0
換成J
代碼:
|
sed 'y/1234567890/ABCDEFGHIJ/' filename ABCDEFGHIJ BCDEFGHIJA CDEFGHIJAB DEFGHIJABC |
注意變換關係是按兩個list的位置對應變換,y是一個管局命令,拒絕使用尾碼flag/g
list1:1234567890
list2:ABCDEFGHIJ
下
面再作一個與前例相反的變換
代碼:
|
sed 'y/0987654321/ABCDEFGHIJ/' filename JIHGFEDCBA IHGFEDCBAJ HGFEDCBAJI GFEDCBAJIH |
2.替換每行第一個匹配
代碼:
|
sed 's/regexpr/anyword/' filename sed 's/regexpr/anyword/1' filename |
舉例:
引用:
|
cat filename 1234567890 2345678901 3456789012 4567890123 sed 's/5/五/' filename 1234五67890 2345 678901 34五6789012 45 67890123 |
3.替換每行第n(如果有的
話)個匹配
代碼:
|
sed "s/regexpr/anyword/${n}" filename cat filename 111111111111111111 222222222222222222 333333333333333333 444444444444444444 舉 例 sed "s/4/ 四 /8" filename 111111111111111111 222222222222222222 333333333333333333 4444444 四 4444444444 |
4.替換每行所有匹配
代碼:
|
cat filename 1234567890 2345678901 3456789012 4567890123 |
代碼:
|
舉例: sed 's/3/三/g' filename 12三4567890 2三45678901 三456789012 456789012三 |
二.行號處理
1.
為檔案加行號
代碼:
|
sed = filename|sed 'N;s//n/:/' cat filename 111111111111111111 222222222222222222 333333333333333333 444444444444444444 |
舉例
代碼:
|
sed = filename|sed 'N;s//n/:/' filename 1:111111111111111111 2:222222222222222222 3:333333333333333333 4:444444444444444444 |
2.僅為檔案中的本文行加行
號
代碼:
|
| sed /./= a|sed '/./N;s//n/:/' |
舉例
代碼:
|
cat filename 111111111111111111 222222222222222222 333333333333333333 444444444444444444 sed /./= a|sed '/./N;s//n/:/' filename 1:111111111111111111 3:222222222222222222 4:333333333333333333 6:444444444444444444 |
三.字串翻轉
代碼:
|
| sed '//n/!G;s//(./)/(.*/n/)/&/2/1/;//D;s/.//' |
舉例
代碼:
|
echo 1234567890|sed '//n/!G;s//(./)/(.*/n/)/&/2/1/;//D;s/.//' 0987654321 |
四.選擇性輸出
1.列印文檔奇數行(隔行輸出)
代碼:
|
sed 'n;d' sed 'x;$!N;x' sed -n 'p;n' 1 3 5 7 |
2.列印偶數行(隔行輸出)
代碼:
|
sed -n 'n;p' sed '1d;n;d;' 2 4 6 8 |
3.刪除連續重複行(大量使
用了pattern space 檔案太大時要注意)
代碼:
|
sed '$!N; /^/(.*/)/n/1$/!P; D' #使用 $!N 要當心記憶體溢出 |
舉例
代碼:
|
cat file 111111111111111111 222222222222222222 222222222222222222 333333333333333333 444444444444444444 444444444444444444 444444444444444444 444444444444444444 444444444444444444 sed '$!N; /^/(.*/)/n/1$/!P; D' filename 111111111111111111 222222222222222222 333333333333333333 444444444444444444 |
4.合并上下行並以空格相分
隔
舉例
代碼:
|
cat file 1234567890 0987654321 執行命令後 1234567890 0987654321 |
5.將以/符號結尾的行與下行合并並以空格分隔(拼接斷行)
代碼:
|
| sed -e :a -e '///$/N; s////n/ /; ta' |
舉例
代碼:
|
cat filename 1 111111111111111111/ 2 222222222222222222 3 333333333333333333/ 4 444444444444444444 sed -e :a -e '///$/N; s////n/ /; ta' filename 1 111111111111111111 2 222222222222222222 3 333333333333333333 4 444444444444444444 |
6.按關鍵字拼接行
如果某行以=開始,則合并到上一行並替代=為空白格
代碼:
|
| sed -e :a -e '$!N;s//n=/ /;ta' -e 'P;D' |
舉例
代碼:
|
cat file 111111111111111111 222222222222222222 =333333333333333333 444444444444444444 sed -e :a -e '$!N;s//n=/ /;ta' -e 'P;D' filename 111111111111111111 222222222222222222 333333333333333333 444444444444444444 |
7.輸出匹配行的下一行
代碼:
|
| sed -n '/regexpr/{n;p;}' filename |
舉例
代碼:
|
cat filename 1 111111111111111111 2 222222222222222222 3 333333333333333333 4 444444444444444444 sed -n '/^3/{n;p;}' filename 4 444444444444444444 |
8.顯示匹配行的行號並輸出
匹配行的上行、匹配行、下行
sed -n -e '/regexpr/{=;x;1!p;g;$!N;p;D;}'
-e h
舉例
代碼:
|
cat filename 1 111111111111111111 2 222222222222222222 3 333333333333333333 4 444444444444444444 sed -n -e '/^3/{=;x;1!p;g;$!N;p;D;}' -e h filename 3 #匹配行的行號 2 222222222222222222 #上一行 3 333333333333333333 #匹配行 4 444444444444444444 #下一行 |
9.刪除文檔中某標誌地區內
的關鍵字匹配行
刪除文檔中從being開到end結束的塊中包含myword的行
代碼:
|
| sed '/^begin/,/^end/{/myword/d;}' filename |
引用:
|
cat filename myword begin myword Number! myword Number! myword Number! myword Number! end myword Number! |
測試
引用:
|
myword begin Number! Number! Number! Number! end myword Number! |
五.字串解析
1.從字串中解析出兩個子串(前2各字元和後9個字元)
代碼:
|
echo "WeLoveChinaUnix"|sed -e 'H;s//(../).*//1/;x;s/.*/(./{9/}/)$//1/;x;G;s//n/ /' We ChinaUnix |
2.分解日期串
代碼:
|
echo 20030922|sed 's//(..../)/(../)/(../)//1 /2 /3/'|read year month day echo $year $month $day 2003 09 22 |