SED學習筆記

來源:本站原創 Linux 超過762 views圍觀 0條評論

聲明:這些代碼只是為了學習和理解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 2345678901

34五6789012 4567890123

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.合并上下行并以空格相分隔

sed ‘$!N;s/\n/ /’

舉例

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個字符和后7個字符)

echo "WeLoveLinuxpk"|sed -e ‘H;s/\(..\).*/\1/;x;s/.*\(.\{7\}\)$/\1/;x;G;s/\n/ /’

We Linuxpk

2.分解日期串

echo 20120107|sed ‘s/\(….\)\(..\)\(..\)/\1 \2 \3/’|read year month day

echo $year $month $day

2012 01 07

本文來自:Linux文庫 — http://doc.linuxpk.com/12671.html

文章出自:CCIE那點事 http://www.qdxgqk.live/ 版權所有。本站文章除注明出處外,皆為作者原創文章,可自由引用,但請注明來源。 禁止全文轉載。
本文標題:SED學習筆記
本文鏈接:http://www.qdxgqk.live/?p=3168轉載請注明轉自CCIE那點事
如果喜歡:點此訂閱本站
下篇文章:
  • 相關文章
  • 為您推薦
  • 各種觀點
?
暫時還木有人評論,坐等沙發!
發表評論

您必須 [ 登錄 ] 才能發表留言!

?
?
萌宠夺宝游戏