精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

系統工程師的自我修養:sed篇

系統 Linux
本文除特殊注明外均針對傳統UNIX中的sed,而非GNU的版本,以保證通用性,本文對sed的講述和總結不為求全面,只求實用性和適用性強。有需要還是參閱man手冊和sed相關資料。

 注:本文除特殊注明外均針對傳統UNIX中的sed,而非GNU的版本,以保證通用性,GNU的新特性本文暫不進行介紹,請參看手冊。另外,本文對sed的講述和總結不為求全面,只求實用性和適用性強。有需要還是參閱man手冊和sed相關資料。

1.原理篇

掌握這個東西首先需要掌握的就是原理,否則一切技巧都是白扯。sed以行為處理單位,默認輸入輸出均為系統標準輸入輸出(因此除非重定向,否則它并不真正修改文件),它首先判斷要處理的行是否在要處理的范圍之內(下一章中稱之為SELECTION),如果是則讀入pattern space中,這是sed進行字符串處理工作的一個區域。腳本中的sed命令逐條執行來編輯pattern space里面的字符串,執行完畢后將該pattern space中處理過的字符串進行輸出,隨之pattern space被清空;接著,再重復執行剛才的動作,文件中的新的一行被讀入,判斷是否在SELECTION中,編輯、輸出,直到文件處理完畢,整個過程如下圖所示。除了 pattern space 外,sed還有一個 hold space,用處是暫存文字字符串的地方,hold space中的字符串只是用于臨時處理的中間結果,是不會被輸出的(在本文第四章會有介紹,此時不了解不影響閱讀此文)。

clip_image002

2.用途篇

學習一個腳本語言,了解了基本原理后就要調研一下這個東東是不是滿足完成你任務的需求。一提到sed,肯定就會牽扯到awk,它具體的功能會在后邊的awk篇進行敘述。對于同一個任務,sed和awk都有可能解決,因此對于sed、awk的用途每個人都有不同的習慣和自己擅長的用法,在實踐中,我個人習慣于用sed進行行處理,也就是根據sed的原理,需要進行一行行的處理操作時優先使用sed。而用awk更多的進行列處理。而在具體任務上,由于sed強大的替換能力和編輯能力,我常常用sed作為編輯器,而awk 作為信息獲取和格式處理輸出的能力。#p#

3.初級語法篇

作為一個腳本類工具,確定就要用它完成任務后,要開始真正使用它,掌握其語言特性是必不可少的。形式上,使用sed采用如下命令格式:

sed [options] 'SELECTION edit-instructions'  file(s)

從命令格式可以看出sed可以一次處理多個文本。此處先不介紹options,因為options往往要和后邊的command進行配合而才能體現出價值。下邊,我們先從command開始了解。

根據是否使用hold space(不懂這個概念也可先往下看,讀完本文就明白)的區別,對于一個初級用戶,了解如下sed中不使用hlod space 的command是實踐的第一步。本文在此基礎上以解決問題的思路首先來介紹不使用hold space 的命令,另外需要說明的是正則表達式是另一個配合使用的利器,在本文中為了不引入更大的麻煩,因此用例中盡量使用最簡答的正則表達式。

1)范圍選取

在sed中如果不指定范圍,則處理命令是針對整個標準輸入的。如需要在某個范圍內進行處理,則需要進行范圍選取。也就是命令格式中的SELSECTION。sed根據SELECTION取得相應的文本行,在這些行中根據edit-instructions進行編輯。注意,SELECTION和edit-instructions中的空格不是必須的。

SELECTION 可以如下表達:

  • 單個行號:如1為取第一行,5為取第五行,$為取最后一行             
  • 行范圍:如5,$   為取從第五行到最后一行之間的文本行
  • 單個正則匹配:如/string/ 為取包含string的行
  • 一個正則匹配范圍:如/^on/,/off$/ 為取從on開頭的行到off結尾的行之間(含這兩個匹配行)所包含的文本行。
  • 行范圍與正則匹配范圍集合:如10,/man/表示從第10行到包含有man的行之間的文本
  • 除去所匹配行外的范圍:如/Llew/! 表示除了匹配Llew的行外其余的文本行

在進入處理命令前,先介紹一下本文中的幾個示例文件

phonelist:

JCHJCL01:/tmp/gnuhpc#cat phonelist 
Terrell, Terry 617-7989 
Franklin, Francis 704-3876 
Patterson, Pat 614-6122 
Robinson, Robin 411-3745 
Christopher, Chris 305-5981 
Martin, Marty 814-5587 
Llewellyn, Lynn 316-6221 
Jansen, Jan 903-3333 
Llewellyn, Lee 817-8823

paths:

JCHJCL01:/tmp/gnuhpc#cat paths 
/opt/virtprovider/lib 
/var/adm/syslog 
/usr/bin/ 
/usr/local/bin

config.ini:

JCHJCL01:/tmp/gnuhpc#cat config.ini 
[WQMInfo] 
ProxyMode=0 
Proxy= 
RunMode=1 
LastStatisticTime=2012-06-17 
RecordMode=0 
RecordKeyBoard=1 
RecordMouseClick=1 
RecordMouseMove=0 
QMPath=

[BROWSE_MODE] 
ShowToolBar=0 
ShowStatusBar=0 
AutoCloseDialog=0 
MinimizeToHide=0

[DEVELOP_MODE] 
ShowToolBar=1 
ShowStatusBar=1 
AutoCloseDialog=0 
MinimizeToHide=1 
[RUN_MODE] 
ShowToolBar=1 
ShowStatusBar=1 
AutoCloseDialog=1 
MinimizeToHide=1

JCHJCL01:/tmp/gnuhpc#

2)打印命令

明確如何界定需要處理文本后,首先學習一個簡單的命令:打印這部分文本。

基本語法:SELSECTIONp 打印pattern space中的內容

Task1:打印包含Franklin的行

JCHJCL01:/tmp/gnuhpc#sed -n '/Franklin/p' phonelist 
Franklin, Francis 704-3876

注意,選項-n 表示所有都不打印,而僅僅打印出匹配的行,可以試一試沒有這個選項的情況。回顧sed機制,它會將文本一行行放在pattern space,不管你做什么樣的后續操作、甚至不做任何編輯動作,它都會在command執行完后把pattern space打出來,這你就理解了為什么要用這個選項。

3)處理命令

a)  增改操作:

基本語法:

SELECTIONx\
text

其中斜杠后有回車,而x則為:

i 表示插入選中行前

a 表示追加在選中行之后

c 表示將選中行修改為text

Task2:在第二行前插入一個聯系人Jonney, Wang 923-3322

JCHJCL01:/tmp/gnuhpc#sed '2i\                    
> Jonney, Wang 923-3322' phonelist 
Terrell, Terry 617-7989 
Jonney, Wang 923-3322 
Franklin, Francis 704-3876 
Patterson, Pat 614-6122 
Robinson, Robin 411-3745 
Christopher, Chris 305-5981 
Martin, Marty 814-5587 
Llewellyn, Lynn 316-6221 
Jansen, Jan 903-3333 
Llewellyn, Lee 817-8823

Task3:在Martin, Marty后加入聯系人Jonney, Wang 923-3322

JCHJCL01:/tmp/gnuhpc#sed '/Martin, Marty/a\ 
> Jonney, Wang 923-3322' phonelist 
Terrell, Terry 617-7989 
Franklin, Francis 704-3876 
Patterson, Pat 614-6122 
Robinson, Robin 411-3745 
Christopher, Chris 305-5981 
Martin, Marty 814-5587 
Jonney, Wang 923-3322 
Llewellyn, Lynn 316-6221 
Jansen, Jan 903-3333 
Llewellyn, Lee 817-8823

Task3:將名字為Llewellyn的記錄都記為“BANNED”

JCHJCL01:/tmp/gnuhpc#sed '/Llewellyn/c\            
BANNED' phonelist 
Terrell, Terry 617-7989 
Franklin, Francis 704-3876 
Patterson, Pat 614-6122 
Robinson, Robin 411-3745 
Christopher, Chris 305-5981 
Martin, Marty 814-5587 
BANNED 
Jansen, Jan 903-3333 
BANNED

b)刪除操作

基本語法:

SELECTIONd ,清除pattern space中的所有內容

Task4 刪除最后一行:

JCHJCL01:/tmp/gnuhpc#sed '$d' phonelist 
Terrell, Terry 617-7989 
Franklin, Francis 704-3876 
Patterson, Pat 614-6122 
Robinson, Robin 411-3745 
Christopher, Chris 305-5981 
Martin, Marty 814-5587 
Llewellyn, Lynn 316-6221 
Jansen, Jan 903-3333

c)替換操作:

基本語法:

'SELECTION s/old string/new string/’ 替換所選區域中第一次出現的old string

'SELECTION s/old string/new string/g’ 替換所選區域中所有的old string

'SELECTION y/string1/string2/’ 對所選區域中的string1所含字符對應替換為string2中同位置的字符,與tr命令相同。

Task5:將第一個Robin替換為Robbins

JCHJCL01:/tmp/gnuhpc#sed 's/Robin/Robbins/' phonelist 
Terrell, Terry 617-7989 
Franklin, Francis 704-3876 
Patterson, Pat 614-6122 
Robbinsson, Robin 411-3745 
Christopher, Chris 305-5981 
Martin, Marty 814-5587 
Llewellyn, Lynn 316-6221 
Jansen, Jan 903-3333 
Llewellyn, Lee 817-8823

Task6:將所有Rob替換為John

JCHJCL01:/tmp/gnuhpc#sed 's/Rob/John/g' phonelist 
Terrell, Terry 617-7989 
Franklin, Francis 704-3876 
Patterson, Pat 614-6122 
Johninson, Johnin 411-3745 
Christopher, Chris 305-5981 
Martin, Marty 814-5587 
Llewellyn, Lynn 316-6221 
Jansen, Jan 903-3333 
Llewellyn, Lee 817-8823

Task7:將/usr/bin/中的/bin/替換為/bin

JCHJCL01:/tmp/gnuhpc#sed 's/\/bin\//\/bin/' paths 
/opt/virtprovider/lib 
/var/adm/syslog 
/usr/bin 
/usr/local/bin

在這種出現很多/的文件時需要\來進行轉義,稍微一多就容易出錯,那么采用如下的方式把替換分隔符的方式進行就好,其中感嘆號只是一個其他類字符,換做另外一個字符(例如@)也是沒有關系的:

JCHJCL01:/tmp/gnuhpc#sed 's!/bin/!/bin!' paths 
/opt/virtprovider/lib 
/var/adm/syslog 
/usr/bin 
/usr/local/bin

Task8:加密所有的1234,規則為將文件中1、2、3、4對應改為A、B、C、D:

JCHJCL01:/tmp/gnuhpc#sed 'y/1234/ABCD/' phonelist 
Terrell, Terry 6A7-7989 
Franklin, Francis 70D-C876 
Patterson, Pat 6AD-6ABB 
Robinson, Robin DAA-C7D5 
Christopher, Chris C05-598A 
Martin, Marty 8AD-5587 
Llewellyn, Lynn CA6-6BBA 
Jansen, Jan 90C-CCCC 
Llewellyn, Lee 8A7-88BC

d)寫文件操作:

基本語法:'SELECTION command/w filename’

Task9:將所有Rob 改為Robbin,并將結果寫到一個叫做result 的文件中

JCHJCL01:/tmp/gnuhpc#sed 's/Rob/Robbin/gw result' phonelist 
Terrell, Terry 617-7989 
Franklin, Francis 704-3876 
Patterson, Pat 614-6122 
Robbininson, Robbinin 411-3745 
Christopher, Chris 305-5981 
Martin, Marty 814-5587 
Llewellyn, Lynn 316-6221 
Jansen, Jan 903-3333 
Llewellyn, Lee 817-8823 
JCHJCL01:/tmp/gnuhpc#cat result 
Robbininson, Robbinin 411-3745

e)讀文件操作:

基本語法:'SELECTION command/r filename’

Task10:如果phonelist中存在Patterson,則將文件paths的內容加入到Patterson后的那一行

JCHJCL01:/tmp/gnuhpc#sed '/Patterson/r paths' phonelist 
Terrell, Terry 617-7989 
Franklin, Francis 704-3876 
Patterson, Pat 614-6122 
/opt/virtprovider/lib 
/var/adm/syslog 
/usr/bin/ 
/usr/local/bin 
Robinson, Robin 411-3745 
Christopher, Chris 305-5981 
Martin, Marty 814-5587 
Llewellyn, Lynn 316-6221 
Jansen, Jan 903-3333 
Llewellyn, Lee 817-8823

f)批處理操作:

如果要處理的很多,我們也可以將sed命令寫入一個腳本,然后運行時采用-f選項指定運行該腳本就行。請注意sed會將第一條命令執行的結果發給第二條執行,因此命令的順序尤為重要。

基本語法:sed -f scriptfile  filename

Task11:把617替換為817,把704替換為522,把411替換為235

JCHJCL01:/tmp/gnuhpc#cat subscript 
s/617/817/ 
s/704/522/ 
s/411/235/ 
JCHJCL01:/tmp/gnuhpc#sed -f subscript phonelist 
Terrell, Terry 817-7989 
Franklin, Francis 522-3876 
Patterson, Pat 614-6122 
Robinson, Robin 235-3745 
Christopher, Chris 305-5981 
Martin, Marty 814-5587 
Llewellyn, Lynn 316-6221 
Jansen, Jan 903-3333 
Llewellyn, Lee 817-8823

也可以使用多行操作模式,基本語法為:

'SELECTION1 operation1
…
SELECTIONn operationn'

其實就是把多個命令用回車連起來

Task12:將Martin替換Mary,將Tearrey替換為Tearrey

JCHJCL01:/tmp/gnuhpc#sed 's/Martin/Mary/ 
s/Terrell/Tearrey/' phonelist 
Tearrey, Terry 617-7989 
Franklin, Francis 704-3876 
Patterson, Pat 614-6122 
Robinson, Robin 411-3745 
Christopher, Chris 305-5981 
Mary, Marty 814-5587 
Llewellyn, Lynn 316-6221 
Jansen, Jan 903-3333 
Llewellyn, Lee 817-8823

另一種方式是使用-e選項,基本語法為:

-e ‘command1’ –e ‘command2’

同樣的任務:

JCHJCL01:/tmp/gnuhpc#sed -e 's/Martin/Mary/' -e 's/Terrell/Tearrey/' phonelist 
Tearrey, Terry 617-7989 
Franklin, Francis 704-3876 
Patterson, Pat 614-6122 
Robinson, Robin 411-3745 
Christopher, Chris 305-5981 
Mary, Marty 814-5587 
Llewellyn, Lynn 316-6221 
Jansen, Jan 903-3333 
Llewellyn, Lee 817-8823

還有另外一種方法,有點類似于C語言中分號的使用:

JCHJCL01:/tmp/gnuhpc#sed 's/Martin/Mary/;s/Terrell/Tearrey/' phonelist   
Tearrey, Terry 617-7989 
Franklin, Francis 704-3876 
Patterson, Pat 614-6122 
Robinson, Robin 411-3745 
Christopher, Chris 305-5981 
Mary, Marty 814-5587 
Llewellyn, Lynn 316-6221 
Jansen, Jan 903-3333 
Llewellyn, Lee 817-8823

我一般習慣于采用分號,簡單也夠明了。另外,對于同一個區域,還可以使用{}進行處理:

Task13:將含有QM的行中QM改為PM,=號改為“:”

JCHJCL01:/tmp/gnuhpc#sed '/QMPath/{s/QM/PM/ 
> s/=/:/ 
> }' config.ini 
[WQMInfo] 
ProxyMode=0 
Proxy= 
RunMode=1 
LastStatisticTime=2012-06-17 
RecordMode=0 
RecordKeyBoard=1 
RecordMouseClick=1 
RecordMouseMove=0 
PMPath:

[BROWSE_MODE] 
ShowToolBar=0 
ShowStatusBar=0 
AutoCloseDialog=0 
MinimizeToHide=0

[DEVELOP_MODE] 
ShowToolBar=1 
ShowStatusBar=1 
AutoCloseDialog=0 
MinimizeToHide=1 
[RUN_MODE] 
ShowToolBar=1 
ShowStatusBar=1 
AutoCloseDialog=1 
MinimizeToHide=1

JCHJCL01:/tmp/gnuhpc#

#p#

4.進階語法篇之hold space的使用

開篇提到了這個hold space,再復習一遍:Hold space 是 sed 用來暫存 pattern space 內容的一個臨時空間。在處理中,有時我們希望保留pattern space的內容在下一次進行處理,因此sed的開發者設計實現了hold space,并且提供了很多命令在pattern space和hold space之間進行復制。記憶上,g和G都是get 的意思,表示從hold space取出放回pattern space,而h和H都是hold的意思,也就是從pattern space到hlod space。

基本語法:

g :將hold space中的內容拷貝到pattern space中,原來pattern space里的內容清除

G:pattern space末尾加上換行符后將hold space中的內容append到pattern space中

h:將pattern space中的內容拷貝到hold space中,原來的hold space里的內容被清除

H:hold space末尾加上換行符后將pattern space中的內容append到hold space中

x :交換 hold space 與 pattern space 內容

Task13:倒置phonelist

我們可以拿一個簡單的文件來理清思路:

A

B

C

D

如下圖:

sed插圖1

除了第一行和最后一行處理不一樣以外(第一行只執行h,而最后一行只執行G),其余行都是用G、d和h(使用d 的原因是不把中間結果輸出)。在sed中有個操作是!,也就是編程語言中的“非”,即不執行,因此,我們可以寫出sed命令來倒置一個文件:

JCHJCL01:/tmp/gnuhpc#sed '1!G;h;$!d' phonelist 
Llewellyn, Lee 817-8823 
Jansen, Jan 903-3333 
Llewellyn, Lynn 316-6221 
Martin, Marty 814-5587 
Christopher, Chris 305-5981 
Robinson, Robin 411-3745 
Patterson, Pat 614-6122 
Franklin, Francis 704-3876 
Terrell, Terry 617-7989

#p#

5.進階語法篇之元字符的使用

sed有幾個很NB的元字符,這部分往往與正則表達式一起使用能夠得到事半功倍的效果。

基本語法:

& : 代表SELECTION中匹配的部分,常用于某個子字符串前后添加字符的操作

\num : num代表匹配子字符串的序號,從1開始,\num表示匹配的子字符串(正則表達式中稱為分組),其中子字符串的匹配模式是由圓括號及其轉義字符構成。

Task 15:將每個電話號碼前加上Tel:

JCHJCL01:/tmp/gnuhpc#sed '/[0-9]\{3\}-[0-9]\{4\}/s//Tel: &/g' phonelist 
Terrell, Terry Tel: 617-7989 
Franklin, Francis Tel: 704-3876 
Patterson, Pat Tel: 614-6122 
Robinson, Robin Tel: 411-3745 
Christopher, Chris Tel: 305-5981 
Martin, Marty Tel: 814-5587 
Llewellyn, Lynn Tel: 316-6221 
Jansen, Jan Tel: 903-3333 
Llewellyn, Lee Tel: 817-8823

可以看到前邊SELECTION是一個正則表達式來匹配電話號碼,也就是0-9三位數-0-9四位數這樣一個匹配邏輯,關鍵是元字符的使用,&代表了匹配的這串電話號碼,在前邊加上Tel:就是件很隨意的事情了。

Task16:電話號碼升級,從原來的四位數統一升級為五位數,6開頭。

JCHJCL01:/tmp/gnuhpc#sed 's/\([0-9]\{3\}\)-\([0-9]\{4\}\)/\1-6\2/g' phonelist 
Terrell, Terry 617-67989 
Franklin, Francis 704-63876 
Patterson, Pat 614-66122 
Robinson, Robin 411-63745 
Christopher, Chris 305-65981 
Martin, Marty 814-65587 
Llewellyn, Lynn 316-66221 
Jansen, Jan 903-63333 
Llewellyn, Lee 817-68823

Task17:將paths文件中的路徑用逗號連起來。首先,將每一行都放入hold space(以\n連接起來)而這個中間過程不顯示(也就是$!d所表示的除非處理到最后一行,否則都把pattern space刪掉),隨后在到最后一行時將hold space中的內容放回pattern space(此處用了x,其實g也是可以的),并且把開頭的\n去掉后將剩余的\n替換為,最后打印。

JCHJCL01:/tmp/gnuhpc#sed 'H;$!d;${ 
> x 
> s/^\n// 
> s/\n/,/g 
> }' paths 
/opt/virtprovider/lib,/var/adm/syslog,/usr/bin/,/usr/local/bin

6.進階語法篇之改變處理流程操作

有時我們希望對匹配的下一行或多行進行操作,有時我們又希望在處理完畢后馬上退出(因為sed會對讀入文本的每一行進行操作,即使肉眼看起來明顯不匹配也是需要sed先把字符串load進來與SELECTION對照判斷的),此時就需要改變處理流程。

基本語法:

n:將之前讀入的行(也就是在pattern space中的行)輸出到屏幕,然后為將下一行的內容提前讀入pattern space(替換上邊已經打印的行),后續的命令會應用到新讀入的行上。

q:  使用時前邊加行號n,表示取前n行,這個在讀取大文件的前幾行時有很大的作用。

N:將下一行的內容讀取并追加到當前模式空間中(用換行符作為連接),并沒有輸出當前模式空間中的行。注意pattern space含有多行時,正則表達式符號^和$含義分別為^匹配模式空間的最開始,而$是匹配模式空間的最后位置。

D:該命令刪除模式空間中從第一個字符到第一個換行符的內容,并且跳轉到命令開頭重新執行。注意,當模式空間仍有內容時,不讀入新的輸入行,類似形成一個循環。

P:僅打印模式空間中從第一個字符到第一個換行符的內容,重新在模式空間的內容上執行編輯命令,類似形成一個循環。

:label和b label  : 標注一個標簽并跳轉。例如,下面的例子中模擬了一個if操作存在符合pattern則跳過command2直接執行command3

command1
/pattern/b goto
command2
:goto
command3

而下邊的例子則模擬了一個if else操作,符合pattern時執行command3,不符合時執行command3

command1
/pattern/b dosomething
command2
b
:dosomething
command3

Task18:將QMPath后邊的空行刪掉

JCHJCL01:/tmp/gnuhpc#sed '/QMPath/{n 
> /^$/d 
> }' config.ini 
[WQMInfo] 
ProxyMode=0 
Proxy= 
RunMode=1 
LastStatisticTime=2012-06-17 
RecordMode=0 
RecordKeyBoard=1 
RecordMouseClick=1 
RecordMouseMove=0 
QMPath= 
[BROWSE_MODE] 
ShowToolBar=0 
ShowStatusBar=0 
AutoCloseDialog=0 
MinimizeToHide=0

[DEVELOP_MODE] 
ShowToolBar=1 
ShowStatusBar=1 
AutoCloseDialog=0 
MinimizeToHide=1 
[RUN_MODE] 
ShowToolBar=1 
ShowStatusBar=1 
AutoCloseDialog=1 
MinimizeToHide=1

JCHJCL01:/tmp/gnuhpc#

Task19: 取一個大文件的前兩行,可以看到同樣都是取前兩行,由于file這個文件較大,最終導致效率的差別是幾十倍。

JCHJCL01:/tmp/gnuhpc#ls -l file             
-rw-r--r--    1 root     system     78888888 Jan 25 23:20 file 
JCHJCL01:/tmp/gnuhpc#time sed -n '1,2p' file 
1 
2

real    0m0.78s 
user    0m0.35s 
sys     0m0.13s 
JCHJCL01:/tmp/gnuhpc#time sed '2q' file     
1 
2

real    0m0.01s 
user    0m0.00s 
sys     0m0.00s

Task20:將多個連續空行縮減為一個空行,非連續空行保留。$q表示最后一行不進行處理,因為由于前邊的處理,到了最后一行已經不會出現連續空行了。其余的處理邏輯為:匹配空行,讀入下一行,發現下一行還是空行后刪除第一個空行然后繼續讀、處理直到下一行不是空行為止。

JCHJCL01:/tmp/gnuhpc#

sed '/^$/{$q 
N 
/^\n$/D 
}' config.ini 
[WQMInfo] 
ProxyMode=0 
Proxy= 
RunMode=1 
LastStatisticTime=2012-06-17 
RecordMode=0 
RecordKeyBoard=1 
RecordMouseClick=1 
RecordMouseMove=0 
QMPath=

[BROWSE_MODE] 
ShowToolBar=0 
ShowStatusBar=0 
AutoCloseDialog=0 
MinimizeToHide=0

[DEVELOP_MODE] 
ShowToolBar=1 
ShowStatusBar=1 
AutoCloseDialog=0 
MinimizeToHide=1 
[RUN_MODE] 
ShowToolBar=1 
ShowStatusBar=1 
AutoCloseDialog=1 
MinimizeToHide=1

JCHJCL01:/tmp/gnuhpc#

#p#

6.sed技巧拾零篇

本來想介紹一下正則表達,無奈太博大精深,幾個例子也說明不了太多,因此正則表達部分可以參考sed手冊,里面有比較詳盡的講解。此處舉一些常用和手冊上沒有提及的用例。

[:alnum:]:表示所有的字母和數字

[:digit:]: 表示所有數字

[:upper:]: 表示所有的大寫字母

[:lower:] :表示所有的小寫字母

Task21:去掉config.ini中的數字,使得config.ini變為一個配置文件模板

JCHJCL01:/tmp/gnuhpc#sed 's/[[:digit:]]//g' config.ini 
[WQMInfo] 
ProxyMode= 
Proxy= 
RunMode= 
LastStatisticTime=-- 
RecordMode= 
RecordKeyBoard= 
RecordMouseClick= 
RecordMouseMove= 
QMPath=

[BROWSE_MODE] 
ShowToolBar= 
ShowStatusBar= 
AutoCloseDialog= 
MinimizeToHide=

[DEVELOP_MODE] 
ShowToolBar= 
ShowStatusBar= 
AutoCloseDialog= 
MinimizeToHide= 
[RUN_MODE] 
ShowToolBar= 
ShowStatusBar= 
AutoCloseDialog= 
MinimizeToHide=

利用SELECTION進行取符合匹配條件的連續多行:

Task22:取得config.ini中WQMInfo段

JCHJCL01:/tmp/gnuhpc#sed -n '/WQMInfo/,/^$/p' config.ini 
[WQMInfo] 
ProxyMode=0 
Proxy= 
RunMode=1 
LastStatisticTime=2012-06-17 
RecordMode=0 
RecordKeyBoard=1 
RecordMouseClick=1 
RecordMouseMove=0 
QMPath=

取匹配條件的上N行和下N行:

Task23:取得通訊錄中Martin上邊的一個人的記錄,讀入下一行到模式空間,并且判斷是否包含Lynn,如果匹配,則打印模式空間中的第一行,如果不匹配,則刪除模式空間的第一行,循環處理。

JCHJCL01:/tmp/gnuhpc#sed -n '$!N;/Lynn/!D;/Lynn/P' phonelist 
Martin, Marty 814-5587

Task24:取得Martin上邊包含Martin的所有人記錄:

JCHJCL01:/tmp/gnuhpc#sed -n '1,/Martin/p' phonelist   
Terrell, Terry 617-7989 
Franklin, Francis 704-3876 
Patterson, Pat 614-6122 
Robinson, Robin 411-3745 
Christopher, Chris 305-5981 
Martin, Marty 814-5587

Task25:取得Martin上邊包含Martin的三條記錄:

JCHJCL01:/tmp/gnuhpc#sed -n '1,/Martin/p' phonelist | tail -3 
Robinson, Robin 411-3745 
Christopher, Chris 305-5981 
Martin, Marty 814-5587

Task26:取得通訊錄中Martin下邊的一個人的記錄:

JCHJCL01:/tmp/gnuhpc#sed -n '/Martin/{n 
> p 
> }' phonelist 
Llewellyn, Lynn 316-6221

Task27:取得Martin下邊包含Martin的所有人記錄:

JCHJCL01:/tmp/gnuhpc#sed -n '/Martin/,$p' phonelist 
Martin, Marty 814-5587 
Llewellyn, Lynn 316-6221 
Jansen, Jan 903-3333 
Llewellyn, Lee 817-8823

Task28:取得Martin下邊包含Martin的三條記錄:

JCHJCL01:/tmp/gnuhpc#sed -n '/Martin/,$p' phonelist | head -3 
Martin, Marty 814-5587 
Llewellyn, Lynn 316-6221 
Jansen, Jan 903-3333

注釋掉某些行:

Task29:假設ini文件行注釋為前后兩個感嘆號,請注釋掉RecordMouseMove

JCHJCL01:/tmp/gnuhpc#sed 's/^RecordMouseMove.*/!!&!!/' config.ini 
[WQMInfo] 
ProxyMode=0 
Proxy= 
RunMode=1 
LastStatisticTime=2012-06-17 
RecordMode=0 
RecordKeyBoard=1 
RecordMouseClick=1 
!!RecordMouseMove=0!! 
QMPath=

[BROWSE_MODE] 
ShowToolBar=0 
ShowStatusBar=0 
AutoCloseDialog=0 
MinimizeToHide=0

[DEVELOP_MODE] 
ShowToolBar=1 
ShowStatusBar=1 
AutoCloseDialog=0 
MinimizeToHide=1 
[RUN_MODE] 
ShowToolBar=1 
ShowStatusBar=1 
AutoCloseDialog=1 
MinimizeToHide=1

Task30:假設paths文件用#進行注釋,則注釋掉含有usr的行

JCHJCL01:/tmp/gnuhpc#sed 's/.*usr.*/#&/' paths 
/opt/virtprovider/lib 
/var/adm/syslog 
#/usr/bin/ 
#/usr/local/bin

一個更簡單的方法是:

JCHJCL01:/tmp/gnuhpc#sed '/usr/s/^/#/' paths 
/opt/virtprovider/lib 
/var/adm/syslog 
#/usr/bin/ 
#/usr/local/bin

Task31:在paths中每行加一個行號和冒號

JCHJCL01:/tmp/gnuhpc#sed = paths  | sed 'N;s/\n/:/' 
1:/opt/virtprovider/lib 
2:/var/adm/syslog 
3:/usr/bin/ 
4:/usr/local/bin

Task32: 處理XML

JCHJCL01:/tmp/gnuhpc#echo "<Amount>10kg</Amount>" | sed 's#\(<Amount>\)[0-9,a-z]*\(</Amount>\)#\1'100kg'\2#g' 
<Amount>100kg</Amount>

Task33:替代一行中多個匹配模式中的其中一個。對于下邊的解釋:前者替換倒數第二個匹配;后者替換最后一個匹配 。

sed 's/(.*)foo(.*foo)/1bar2/ test.txt
sed 's/(.*)foo/1bar/' test.txt

Task34:刪除paths的最后2行,在讀入第一行后,使用N讀入一行,并且如果新讀入的下一行不是最后一行,則打印模式空間中的第一行,并且刪除,然后接著執行N;如果新讀入的一行是文件的最后一行,則刪除模式空間中的所有內容(此時pattern space中即為倒數兩行)。

JCHJCL01:/tmp/gnuhpc#sed 'N;$!P;$!D;$d' paths 
/opt/virtprovider/lib 
/var/adm/syslog

小結篇

本文已幾個文本文件為例子,說明了sed的基本用法指南,由于我本人傾向于腳本要具有高度的可移植性,另外同一個任務不一定都要交給一個工具完成,多個工具配合使用,在不太考慮性能的前提下,simpler better,因此諸多高級用法和GNU sed的用法均在此文沒有涉及。

責任編輯:黃丹 來源: 博客園
相關推薦

2013-10-25 11:19:18

Google大數據Sanjay Ghem

2022-05-05 11:50:58

網絡安全安全人才網絡安全崗位

2015-05-04 13:24:12

工程師OpenStack公有云

2015-10-28 13:39:25

2017-11-06 07:30:56

IT工程師自我管理項目管理

2009-09-08 10:31:01

2010-09-13 17:38:47

Google的系統工程

2015-07-17 08:27:19

EMMBYOD

2015-07-20 09:11:19

企業移動管理EMMBYOD安全

2009-03-11 19:53:26

Linux系統工程師系統管理命令

2020-07-24 09:44:03

安全駐場工程師網絡安全IT安全

2014-09-25 09:41:07

設計師

2011-12-27 16:31:27

程序員

2010-03-15 09:17:19

系統工程師

2011-01-11 10:57:33

數據庫系統工程師

2010-05-19 15:20:20

2021-07-29 10:37:13

漏洞管理自我修養漏洞

2010-01-24 09:34:00

系統工程師最年輕

2015-09-28 09:46:31

ZooKeeper分布式系統瑞士軍刀

2025-04-08 07:40:00

Hyprdots開源系統
點贊
收藏

51CTO技術棧公眾號

最近2019中文字幕mv免费看 | 国产精品白嫩美女在线观看| 精品黑人一区二区三区观看时间| 欧美韩国亚洲| 国产精品久久久久久久午夜片| 91亚洲精品一区二区| 国产无套内射又大又猛又粗又爽| 亚洲黄页网站| 日韩一区二区在线免费观看| av动漫在线看| 美女黄视频在线观看| 粉嫩13p一区二区三区| 青青在线视频一区二区三区| 神马影院午夜我不卡| 久久精品在线观看| 少妇激情av一区二区| 欧美人成在线观看| 亚洲精品在线观| 国产精品jizz在线观看美国| 色在线免费视频| 人妻av无码一区二区三区| 日韩理伦片在线| 成人午夜免费视频| 国产精品视频资源| 五月天婷婷综合网| 亚洲啊v在线观看| 日韩电影在线观看永久视频免费网站| 国产精品区在线| 在线视频超级| 亚洲一区二区中文在线| 亚洲二区自拍| 人妻一区二区三区四区| 久88久久88久久久| 国产精品9999| 五月婷婷开心网| 欧美日韩精品免费观看视频完整| 最新国产精品拍自在线播放 | 亚洲欧洲美洲av| 亚洲人成网站色在线观看| 日韩av大全| 天天摸天天干天天操| 国产精品一区二区在线观看网站| 国产精品久久久av| 69国产精品视频免费观看| 欧美日韩精选| 免费97视频在线精品国自产拍| 亚洲精品成人无码| 亚洲传媒在线| 亚洲精品国精品久久99热| 第一页在线视频| 9999精品免费视频| 在线播放亚洲一区| 污污网站在线观看视频| 国产福利亚洲| 欧美日韩一区二区电影| 日韩一级片播放| 人人鲁人人莫人人爱精品| 精品福利一区二区| 黄色片网址在线观看| av电影在线地址| 亚洲综合一二区| 国产va亚洲va在线va| 在线视频国产区| 亚洲综合久久av| 国产高清www| 成人免费高清观看| 婷婷激情综合网| 国内外成人免费激情视频| 欧美成人性网| 欧美性xxxxxxxx| 97超碰成人在线| 国产精品久久久久久av公交车| 91精品在线观看入口| 特级黄色片视频| jizz18欧美18| 亚洲国产精品专区久久| 99re久久精品国产| 国内精品久久久久久99蜜桃| 三级精品视频久久久久| 免费看特级毛片| 亚洲国产黄色| 国产99久久精品一区二区永久免费| 波多野结衣视频观看| 裸体一区二区三区| 91久久国产综合久久蜜月精品| 乱色精品无码一区二区国产盗| 91麻豆国产香蕉久久精品| 色综合久久久久久久久五月| 久久综合网导航| 亚洲18女电影在线观看| 少妇高清精品毛片在线视频 | 99精品一区二区三区无码吞精| 国语一区二区三区| 亚洲天堂av在线播放| 少妇视频一区二区| 在线观看不卡| 国产精品一区二区三区免费视频| 精品欧美在线观看| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 国产成a人无v码亚洲福利| 精品无码久久久久国产| 成人网视频在线观看| 一区二区三区毛片| 国内外免费激情视频| 精品中文字幕一区二区三区| 日韩成人中文字幕| 天天做夜夜爱爱爱| 亚洲欧美bt| 91色视频在线导航| 激情在线视频| 亚洲一区在线看| av免费网站观看| 亚洲一区二区三区四区电影 | av毛片在线免费看| 色一情一乱一乱一91av| 捷克做爰xxxⅹ性视频| 亚洲成人一品| 欧美精品www| 一女二男一黄一片| 97精品电影院| 久久久久久久久久久综合| yiren22亚洲综合| 亚洲成人av在线| 麻豆精品免费视频| 欧美大人香蕉在线| 国产99视频在线观看| 丰满肥臀噗嗤啊x99av| 亚洲欧美综合色| 国产又大又黄又粗的视频| 久久精品国产亚洲blacked| 久久精品视频播放| 中文人妻熟女乱又乱精品| 成人av资源在线| 4444在线观看| 国产精品3区| 最新亚洲国产精品| 无码久久精品国产亚洲av影片| 91丝袜美腿高跟国产极品老师 | 国产日韩一区欧美| 黄黄的网站在线观看| 欧美色中文字幕| 少妇人妻好深好紧精品无码| 亚洲在线视频| 国产日韩三区| 老司机深夜福利在线观看| 精品国产91洋老外米糕| 欧美日韩黄色网| 狠狠色综合播放一区二区| 亚洲精品tv久久久久久久久| 国产一区二区三区朝在线观看| 国产丝袜精品第一页| 你懂的国产在线| 2020国产精品自拍| 国产a级一级片| 日韩激情网站| 日本精品性网站在线观看| 香蕉人妻av久久久久天天| 国产精品伦理在线| 不卡的av在线| 一色屋精品亚洲香蕉网站| 日韩欧美精品一区二区三区经典| 黄频免费在线观看| 国产一区二区在线观看免费| 91中文字精品一区二区| 黄色小网站在线观看| 欧美高清激情brazzers| 香蕉久久久久久久| 另类中文字幕网| 大桥未久一区二区| 日本综合精品一区| 久久99亚洲精品| 污污的视频网站在线观看| 精品久久久国产精品999| 日本黄色特级片| 天堂精品中文字幕在线| 亚洲最新在线| 51vv免费精品视频一区二区| 久久久这里只有精品视频| 午夜激情小视频| 在线亚洲欧美专区二区| 日韩在线不卡av| 国产精品亚洲午夜一区二区三区 | 欧美日韩a区| 国产亚洲情侣一区二区无| 在线天堂新版最新版在线8| 国产一区二区成人| 国产sm主人调教女m视频| 午夜精品123| 在线视频第一页| 国产精品一二三区| 91视频最新入口| 四虎成人av| 成人资源视频网站免费| 都市激情亚洲综合| 日韩一中文字幕| 手机在线观看免费av| 欧洲国产伦久久久久久久| 看免费黄色录像| 久久精品视频一区二区| 丰满饥渴老女人hd| 久久久噜噜噜| 日产精品久久久久久久蜜臀| 精品视频免费在线观看| 成人在线免费网站| 国产成+人+综合+亚洲欧美| 久久久噜久噜久久综合| 最新国产在线观看| 日韩精品免费在线播放| 国产精品乱码久久久| 大荫蒂欧美视频另类xxxx| 久久福利免费视频| 国产日产欧美精品一区二区三区| 成人一区二区三区仙踪林| 日韩国产高清在线| 丁香花在线影院观看在线播放| 日韩欧美精品一区| 久久久久久九九九九| 日韩一区免费| 国产精品综合网站| 国产免费不卡| 97久久伊人激情网| 最近中文字幕免费mv2018在线| 一区二区三欧美| 欧美日韩视频精品二区| 日韩欧美一区二区在线视频| 在线观看日韩一区二区| 日韩欧美国产成人| 国产做受高潮漫动| 亚洲综合久久av| www欧美com| 国产精品乱码一区二区三区软件 | 久久久久亚洲蜜桃| 国产在线不卡av| 国产精品1024久久| 九九九九九九九九| 久久精品免费观看| 黑人粗进入欧美aaaaa| 国产精品免费看| www.日本在线播放| 亚洲国产专区| 国产亚洲黄色片| 国产精品豆花视频| 日韩a级黄色片| 欧美a级在线| 五月天在线免费视频| 99视频精品全国免费| 伊人av成人| 日韩在线观看| 中文字幕一区二区中文字幕 | 国产日韩欧美一区二区三区| 一区二区在线影院| 国产三级欧美三级日产三级99| 精品日韩在线观看| 国产精品久久久精品| 精品无码一区二区三区在线| 激情综合网五月天| 韩国成人免费视频| 亚洲宅男一区| 一区二区久久久| 一级特级黄色片| 91在线视频在线| 日本一区二区三区网站| 99久久精品久久久久久清纯| 男男做爰猛烈叫床爽爽小说| 91啪九色porn原创视频在线观看| 波多野结衣福利| 91色乱码一区二区三区| 久久丫精品忘忧草西安产品| 中文字幕精品一区| 91狠狠综合久久久| 亚洲一区日韩精品中文字幕| 五月天婷婷网站| 欧美性xxxx极品hd满灌| 精品久久久久久久久久久久久久久久久久| 91黄色免费看| 一级特黄aa大片| 精品国产第一区二区三区观看体验| 天堂成人在线视频| 亚洲欧美日韩天堂一区二区| а天堂8中文最新版在线官网| 久久精品久久久久久国产 免费| 国模雨婷捆绑高清在线| 欧美在线日韩在线| 欧美大片网站| 国产精品传媒毛片三区| 羞羞色国产精品网站| 亚洲欧美日韩精品在线| 欧美激情亚洲| 久久国产色av免费观看| 国产麻豆一精品一av一免费| 一级欧美一级日韩片| 久久久久久久久久久久久夜| 999精品视频在线观看播放| 亚洲综合自拍偷拍| 国内av在线播放| 精品福利av导航| youjizz在线播放| 欧美激情在线视频二区| abab456成人免费网址| 91网免费观看| 精品视频亚洲| 五月丁香综合缴情六月小说| 麻豆精品在线观看| av无码一区二区三区| 中文字幕日韩一区| 国产成人在线免费视频| 91麻豆精品国产91久久久久久久久 | 青青青国产精品一区二区| 国产精品久久久久久久久久久久久久久 | 久久中文娱乐网| 视频这里只有精品| 91国产福利在线| 天天操天天干天天插| 欧美巨猛xxxx猛交黑人97人| 巨胸喷奶水www久久久| 久久国产欧美精品| 一区二区影院| 潘金莲激情呻吟欲求不满视频| 91视频免费观看| 欧美成人精品激情在线视频| 在线观看av一区| 网站黄在线观看| 久久99精品久久久久久青青91| 国产精品诱惑| 色爱区成人综合网| 亚洲欧美日韩国产一区二区| 韩国av中国字幕| 亚洲精品国产精品乱码不99| 一本久道久久综合无码中文| 亚洲无线码在线一区观看| 国产va在线视频| www.av一区视频| 一区二区蜜桃| 中文av字幕在线观看| 国产精品久久久久久久久免费樱桃 | 欧洲日本亚洲国产区| 欧美一区 二区| 日韩一级性生活片| 成人免费高清视频| 久久久久成人网站| 欧美不卡一区二区| 2024最新电影在线免费观看| 91精品视频免费看| 99热在线成人| 99中文字幕在线| 亚洲免费在线视频一区 二区| 国产精品亚洲lv粉色| 最近2019免费中文字幕视频三| 日本黄色一区| 亚洲国产欧美不卡在线观看| 免费看黄色91| 日韩av毛片在线观看| 欧美日韩在线不卡| 日韩在线免费电影| 91理论片午午论夜理片久久| 午夜激情久久| 免费人成视频在线播放| 亚洲女与黑人做爰| 精品国产99久久久久久宅男i| 欧美成人在线免费| 超碰97成人| 男女视频网站在线观看| 99久久国产综合色|国产精品| 精品91久久久| 中国china体内裑精亚洲片| 久久精品嫩草影院| 粉嫩av一区二区三区天美传媒| 成人中文字幕电影| 黄色激情视频在线观看| 亚洲欧美一区二区三区情侣bbw| 456亚洲精品成人影院| 亚洲永久一区二区三区在线| 国产精品亚洲а∨天堂免在线| 青娱乐国产精品| 日韩国产精品一区| 国产原创一区| 久久久久久av无码免费网站下载| jlzzjlzz亚洲日本少妇| 中文字幕在线天堂| 久久久999精品| 日韩系列在线| 日日噜噜夜夜狠狠| 亚洲精品成人在线| 香港三日本三级少妇66| 国产精品专区第二| 亚洲成人中文| 在线观看亚洲大片短视频| 欧美一级淫片007| 亚洲欧洲美洲av| 久久av秘一区二区三区| 99re热视频这里只精品| 在线观看黄色国产| 久久久免费精品视频| 成人区精品一区二区婷婷| 欧美日韩一区二区区| 色婷婷综合中文久久一本| a视频在线免费看| 蜜桃999成人看片在线观看| 黄色精品一二区| 国产亚洲欧美在线精品|