[UNIX Shell筆記] - sed用法介紹

sed是一個非交互性文本流編輯器。它編輯文件或標準輸入導出的文本拷貝。標準輸入多是來自鍵盤、文件重定向、字符串或變量,或者是一個管道的文本。sed能夠作些什麼呢?別忘了,vi也是一個文本編輯器。sed能夠隨意編輯小或大的文件,有許多sed命令用來編輯、刪除,並容許作這項工做時不在現場。sed一次性處理全部改變,於是變得頗有效,對用戶來說,最重要的是節省了時間。

能夠在命令行輸入sed命令,也能夠在一個文件中寫入命令,而後調用sed,這與awk基本相同。使用sed須要記住的一個重要事實是,不管命令是什麼,sed並不與初始化文件打交道,它操做的只是一個拷貝,而後全部的改動若是沒有重定向到一個文件,將輸出到屏幕。
由於sed是一個非交互性編輯器,必須經過行號或正則表達式指定要改變的文本行。
本文介紹sed用法和功能。本章大多編寫的是一行命令和小腳本。這樣作能夠慢慢加深對sed用法的瞭解,取得寶貴的經驗,以便最終本身編出大的複雜sed腳本。
和grep與awk同樣,sed是一種重要的文本過濾工具,或者使用一行命令或者使用管道與grep與awk相結合。

1.sed怎樣讀取數據
sed從文件的一個文本行或從標準輸入的幾種格式中讀取數據,將之拷貝到一個編輯緩衝區,而後讀命令行或腳本的第一條命令,並使用這些命令查找模式或定位行號編輯它。重複此過程直到命令結束。

2.調用sed
調用sed有三種方式:在命令行鍵入命令;將sed命令插入腳本文件,而後調用sed;將sed命令插入腳本文件,並使sed腳本可執行。
使用sed命令行格式爲:
sed [選項] sed命令 輸入文件。
記住在命令行使用sed命令時,實際命令要加單引號。sed也容許加雙引號。
使用sed腳本文件,格式爲:
sed [選項] -f sed 腳本文件 輸入文件
要使用第一行具備sed命令解釋器的sed腳本文件,其格式爲:
sed腳本文件 [選項] 輸入文件
不論是使用shell命令行方式或腳本文件方式,若是沒有指定輸入文件,sed從標準輸入中接受輸入,通常是鍵盤或重定向結果。

sed選項以下:
n 不打印;sed不寫編輯行到標準輸出,缺省爲打印全部行(編輯和未編輯)。p命令能夠用來打印編輯行。
c 下一命令是編輯命令。使用多項編輯時加入此選項。若是隻用到一條sed命令,此選項無用,但指定它也沒有關係。
f 若是正在調用sed腳本文件,使用此選項。此選項通知sed一個腳本文件支持全部的sed命令,例如:sed -f myscript.sedinput_file,這裏myscript.sed即爲支持sed命令的文件。

2.1保存sed輸出
因爲不接觸初始化文件,若是想要保存改動內容,簡單地將全部輸出重定向到一個文件便可。下面的例子重定向sed命令的全部輸出至文件'myoutfile',當對結果很滿意時使用這種方法。
$sed'some-sed-commands'input-file>myoutfile

2.2使用sed在文件中查詢文本的方式
sed瀏覽輸入文件時,缺省從第一行開始,有兩種方式定位文本:
1)使用行號,能夠是一個簡單數字,或是一個行號範圍。
2)使用正則表達式下面是使用sed定位文本的一些方式。

使用sed在文件中定位文本的方式
------------------------------------------------------------------
x                  x爲一行號,如1
x,y                表示行號範圍從x到y,如2,5表示從第2行到第5行
/pattern/          查詢包含模式的行。例如/disk/或/[a-z]/
/pattern/pattern/  查詢包含兩個模式的行。例如/disk/disks/
pattern/,x         在給定行號上查詢包含模式的行。如/ribbon/,3
x,/pattern/        經過行號和模式查詢匹配行。3./vdu/
x,y!               查詢不包含指定行號x和y的行。1,2!

2.3基本sed編輯命令

sed編輯命令
------------------------------------------------------------------
p     打印匹配行
=     顯示文件行號
a\    在定位行號後附加新文本信息
i\    在定位行號後插入新文本信息
d     刪除定位行
c\    用新文本替換定位文本
s     使用替換模式替換相應模式
r     從另外一個文件中讀文本
w     寫文本到一個文件
q     第一個模式匹配完成後推出或當即推出
l     顯示與八進制ASCII代碼等價的控制字符
{}    在定位行執行的命令組
n     從另外一個文件中讀文本下一行,並附加在下一行
g     將模式2粘貼到/patternn/
y     傳送字符
n     延續到下一輸入行;容許跨行的模式匹配語句

sed例子中使用下述文本文件quote.txt。
$catquote.txt
The honeysuckle band played all night long for only $90.
It was an evening of splendid music and company.
Too bad the disco floor fell through at 23:10.
The local nurse Miss P.Neave was in attendance.

3.sed和正則表達式
sed識別任何基本正則表達式和模式及其行匹配規則。記住規則之一是:若是要定位一特殊字符,必須使用(\)屏蔽其特殊含義。


4.基本sed編程舉例

4.1 使用p(rint)顯示行
print命令格式爲[address[, address]P。顯示文本行必須提供sed命令行號。

只打印第二行,用-n
$sed -n '2p' quote.txt
It was an evening of splendid music and company.
若是不指定-n選項,sed '2p' quote.txt 此命令會打印文件中全部行,爲此需使用-n選項。

4.2 打印範圍
能夠指定行的範圍,現打印1到3行,用逗號分隔行號。


$sed -n '1,3p' quote.txt
The honeysuckle band played all night long for only $90.
It was an evening of splendid music and company.
Too bad the disco floor fell through at 23:10.

4.3 打印模式
假定要匹配單詞Neave,並打印此行,方法以下。使用模式/pattern/格式,這裏爲/Neave/。
$sed -n '/Neave/p' quote.txt
The local nurse Miss P.Neave was in attendance.

4.4 使用模式和行號進行查詢
爲編輯某個單詞瀏覽一個文件時, sed返回包含指定單詞的許多行。怎樣使返回結果更精確以知足模式匹配呢?能夠將行號和模式結合使用。假定要改動文件quote.txt最後一行中的單詞the,使用sed查詢the,返回兩行:


$sed -n '/The/p' quote.txt
The honeysuckle band played all night long for only $90.
The local nurse Miss P.Neave was in attendance.

使用模式與行號的混合方式能夠剔除第一行,格式爲line_number,/pattern/。逗號用來分隔行號與模式開始部分。爲達到預期結果,使用4,/the/。意即只在第四行查詢模式the,命令以下:
$sed -n '4,/The/p' quote.txt
The local nurse Miss P.Neave was in attendance.

??????上面有錯,實際上是把第四行後的都打出來了
這個模式應該哪果指定行找不到符合條件的,就從下一行開始查找,直到找到爲止,並把,找到行以前的所有打打印出來。
若是指定行自己就符合條伯,把本行及後面的行的所有打印出來


4.5 匹配元字符
匹配元字符$前,必須使用反斜線\屏蔽其特殊含義。模式爲/\$/p。


$sed -n '/\$/p' quote.txt
The honeysuckle band played all night long for only $90.

4.6 顯示整個文件
要打印整個文件,只需將行範圍設爲第一行到最後一行1,$。$意爲最後一行。
$sed -n '1,$p' quote.txt
The honeysuckle band played all night long for only $90.
It was an evening of splendid music and company.
Too bad the disco floor fell through at 23:10.
The local nurse Miss P.Neave was in attendance.

4.7 任意字符
匹配任意字母,後跟任意字母的0次或屢次重複,並以ing結尾,模式爲/.*ing/。可使用這個模式查詢以ing結尾的任意單詞。


$sed -n '/.*ing/p' quote.txt
It was an evening of splendid music and company.

4.8 首行
要打印文件第一行,使用行號:
$sed -n '1p' quote.txt
The honeysuckle band played all night long for only $90.

4.9 最後一行
要打印最後一行,使用$。$是表明最後一行的元字符。
$sed -n '$p' quote.txt
The local nurse Miss P.Neave was in attendance.

4.10 打印行號
要打印行號,使用等號=。打印模式匹配的行號,使用格式/pattern/=。
$sed -e '/music/=' quote.txt
The honeysuckle band played all night long for only $90.
2
It was an evening of splendid music and company.
Too bad the disco floor fell through at 23:10.
The local nurse Miss P.Neave was in attendance.
整個文件都打印出來,而且匹配行打印了行號。若是隻關心實際行號,使用-e選項。

$sed -n '/music/=' quote.txt
2

若是隻打印行號及匹配行,必須使用兩個sed命令,並使用e選項。第一個命令打印模式匹配行,第二個使用=選項打印行號,格式爲sed -n -e /pattern/p -e /pattern/=

$sed -n -e '/music/p' -e '/music/=' quote.txt
It was an evening of splendid music and company.
2


4.11 建立sed腳本文件
建立腳本文件append.sed:
第一行是sed命令解釋行。腳本在這一行查找sed以運行命令,這裏定位在/bin。
第二行以/company/開始,這是附加操做起始位置。a\通知sed這是一個附加操做,首先應插入一個新行。
第三行是附加操做要加入到拷貝的實際文本。
輸出顯示附加結果。若是要保存輸出,重定向到一個文件。


$catappend.sed
#!/bin/sed-f
/company/a\
Then suddenly it happened.
保存它,增長可執行權限,運行


$chmod u+x append.sed
$./append.sed quote.txt
The honeysuckle band played all night long for only $90.
It was an evening of splendid music and company.
Then suddenly it happend.
Too bad the disco floor fell through at 23:10.
The local nurse Miss P.Neave was in attendance.


或直接用命令行:

$sed "/company/a\Then suddenly it happened." quote.txt
The honeysuckle band played all night long for only $90.
It was an evening of splendid music and company.
Then suddenly it happend.
Too bad the disco floor fell through at 23:10.
The local nurse Miss P.Neave was in attendance.


4.12 插入文本
插入命令相似於附加命令,只是在指定行前面插入。和附加命令同樣,它也只接受一個地址。
如在attendance結尾的行前插入文本utter confusion followed。

$sed "/company/i\utter confusion followed." quote.txt也能夠指定行:


$catinsert.sed
#!/bin/sed-f
4i\
Utter confusion followed.

執行結果
$chmod u+x insert.sed
$./insert.sed quote.txt
The honeysuckle band played all night long for only $90.
It was an evening of splendid music and company.
Too bad the disco floor fell through at 23:10.
Utter confusion followed.
The local nurse Miss P.Neave was inattendance.

4.13 修改文本
修改命令將在匹配模式空間的指定行用新文本加以替代,格式以下:
[address[,address] c\
text\
text\
text\
...
text
將第一行The honeysuckle band played all night long for only $90.替換爲The office Dibble band played well。首先要匹配第一行的任何部分,可以使用模式'/Honeysuckle/'。sed腳本文件爲change.sed。內容以下:
$cat change.sed
#!/bin/sed-f
/honeysuckle/ c\
The office Dibble band played well.

$chmod u+x change.sed
$./change.sed quote.txt
Thehoneysucklebandplayedallnightlongforonly$90.
Itwasaneveningofsplendidmusicandcompany.
TheofficeDibblebandplayedwell.
ThelocalnurseMissP.Neavewasinattendance.或命令行:


$sed"/honeysuck/c\TheOfficeDibblebandplayedwell."quote.txt
The Office Dibble band played well.
It was an evening of splendid music and company.
Too bad the disco floor fell through at 23:10.
The local nurse Miss P.Neave was inattendance.

像插入動做同樣,可使用行號代替模式,兩種方式完成相同的功能。
#!/bin/sed -f
3 c\
The Office Dibble band played well.

能夠對同一個腳本中的相同文件進行修改、附加、插入三種動做匹配和混合操做。
$cat mix.sed
#!/bin/sed-f
#this is a comment line, all comment starts with a #
#name: mix.sed

#this is the change on line 1
1 c\
The Dibble band were grooving.
/#let's now insert a line
evening/ i\
They played some great tunes.
#change the last line, a $ means last line
$c\
Nurse Neave was too tipsy to help.
#stick in a new line before the last line
3 a\
where was the nurse to help?

運行它,結果以下:
$chmod u+x mix.sed
$./mix.sed quote.txt
The Dibble band were grooving.
They played some great tunes.
It was an evening of splendid music and company.
Too bad the disco floor fell through at 23:00.
Where was the nurse to help?
The local nurse Miss P.Neave was inattendance.

4.14 刪除文本
sed刪除文本格式:
[address[,address]]d   
地址能夠是行的範圍或模式。
刪除第一行;1d意爲刪除第一行。


$sed '1d' quote.txt
It was an evening of splendid music and company.
Too bad the disco floor fell through at 23:00.
The local nurse Miss P.Neave was inattendance.

刪除第一到第三行:
$sed '1,3d' quote.txt
The local nurse Miss P.Neave was inattendance.

刪除最後一行:
$sed '$d' quote.txt
The honey suckle band played all night long for only $90.
It was an evening of splendid music and company.
Too bad the disco floor fell through at 23:00.

也可使用正則表達式進行刪除操做。下面的例子刪除包含文本'Neave'的行。
$sed '/Neave/d' quote.txt
The honey suckle band played all night long for only $90.
It was an evening of splendid music and company.
Too bad the disco floor fell through at 23:00.

4.15 替換文本
替換命令用替換模式替換指定模式,格式爲:
[address[,address]] s/ pattern-to-find /replacement-pattern/[g p w n]
s選項通知sed這是一個替換操做,並查詢pattern-to-find,成功後用replacement-pattern替換它。

替換選項以下:
g 缺省狀況下只替換第一次出現模式,使用g選項替換全局全部出現模式。
p 缺省sed將全部被替換行寫入標準輸出,加p選項將使-n選項無效。-n選項不打印輸出結果。
w 文件名使用此選項將輸出定向到一個文件。

如替換night爲NIGHT,首先查詢模式night,而後用文本NIGHT替換它。
$sed 's/night/NIGHT/' quote.txt
The honey suckle band played all NIGHT long for only $90.
It was an evening of splendid music and company.
Too bad the disco floor fell through at 23:00.
The local nurse Miss P.Neave was inattendance.
要從$90中刪除$符號(記住這是一個特殊符號,必須用\屏蔽其特殊含義),在replacement-pattern部分不寫任何東西,保留空白,但仍須要用斜線括起來。在sed中也能夠這樣刪除一個字符串。


$sed 's/\$//' quote.txt
The honey suckle band played all night long for only 90.

要進行全局替換,即替換全部出現模式,只需在命令後加g選項。下面的例子將全部The替換成Wow!。


$sed 's/The/Wow!/g' quote.txt
Wow! honey suckle band played all night long fo ronly $90.
It was an evening of splendid music and company.
Too bad the disco floor fell through at 23:00.
Wow! local nurse Miss P.Neave was inattendance.

將替換結果寫入一個文件用w選項,下面的例子將splendid替換爲SPLENDID的替換結果寫入文件sed.out:
$sed 's/splendid/SPLENDID/wsed.out' quote.txt
注意要將文件名括在sed的單引號裏。文件結果以下:

$cat sed.out
It was an evening of SPLENDID music and company.
正則表達式

5. 使用替換修改字符串
若是要附加或修改一個字符串,可使用( &)命令,&命令保存發現模式以便從新調用它,而後把它放在替換字符串裏面。這裏給出一個修改的設計思路。先給出一個被替換模式,而後是一個準備附加在第一個模式後的另外一個模式,而且後面帶有&,這樣修改模式將放在匹配模式以前。例如,sed語句s/nurse/"Hello"&/p 的結果以下:
$sed -n 's/nurse/"Hello" &/p' quote.txt
The local "hello" nurse Miss P.Neave was in attendance.
原句是文本行The local nurse Miss P.Neave was in attendance。
記住模式中要使用空格,由於輸出結果代表應加入空格。
還有一個例子:
$sed -n 's/played/from Hockering &/p' quote.txt
The honeysuckle band from Hockering played all night long for only $90.
原句是The honeysuckle band played all night long for only $90。

6. 將sed結果寫入文件命令
像使用>文件重定向發送輸出到一個文件同樣,在sed命令中也能夠將結果輸入文件。格式有點像使用替換命令:
[address[,address]]w filename
'w'選項通知sed將結果寫入文件。filename是自解釋文件名。下面有兩個例子。
$sed '1,2 2 filedt' quote.txt
文件quote.txt輸出到屏幕。模式範圍即1,2行輸出到文件filedt。
$cat filedt
The honeysucke band played all night long for only $90.
It was an evening of splendid music and company.
下面例子中查詢模式Neave,匹配結果行寫入文件dht。
$sed '/Neave/ w dht' quote.txt
$cat dht
The local nurse Miss P.Neave was in attendance.

7. 從文件中讀文本
處理文件時,sed容許從另外一個文件中讀文本,並將其文本附加在當前文件。此命令放在模式匹配行後,格式爲:
address r filename
這裏r通知sed將從另外一個文件源中讀文本。filename是其文件名。
如今建立一個小文件sedex.txt,內容以下:
$cat sedex.txt
Boom boom went the music
將sedex.txt內容附加到文件quote.txt的拷貝。在模式匹配行/company/後放置附加文本。本例爲第三行。注意所讀的文件名須要用單引號括起來。
$sed '/company./r sedex.txt' quote.txt
The honysuckle band played all night long for only $90.
It was an evening of splendid music and company.
Boom boom went the music.
Too bad the disco floor fell through at 23:10.
The local nurse Mis P.Neave was in attendance.

8. 匹配後退出
有時須要在模式匹配首次出現後退出sed,以便執行其餘處理腳本。退出命令格式爲:
address q
下面的例子假定查詢模式/.a.*/,意爲任意字符後跟字符a,再跟任意字符0次或任意屢次。
查看文本文件,而後在下列行產生下列單詞:
Line 1.band
Line 2.bad
Liner3.was
Line4.was
查詢首次出現模式,而後退出。須要將q放在sed語句末尾。
$sed '/.a.*q' quote.txt
The honeysuckle band played all night long for only $90.

9. 顯示文件中的控制字符
當從其餘系統下載文件時,有時要刪除整個文件的控制字符(非打印字符),從菜單中捕獲一個應用的屏幕輸出有時也會將控制字符輸出進文件,怎樣知道文件中是否有控制字符?使用cat -v filename命令,屏幕會亂叫,且處處都是一些垃圾字符,這能夠確知文件中包含有控制字符,若是有興趣能夠觀察一下這些字符以便於更加確認它們是控制字符。
一些系統中使用cat filename而不是cat -v來查看非打印字符。
sed格式爲:
[address,[address] ] l
'l'意爲列表。
通常狀況下要列出整個文件,而不是模式匹配行,所以使用l要從第一到最後一行。模式範圍1,$即爲此意。
若是cat一個文件,發現實際上包含有控制字符。
$cat -v func.txt
This is is the F1 key:^[OP
This is the F2 key:^[OQ
如今運行sed命令,觀察輸出結果。

$sed -n '1,$1' func.txt
This is is the F1 key:\033OP$
This is the F2 key:\033OQ$
sed找到並顯示了兩個控制字符。\033表明退格鍵,OP爲F1鍵值,放在退格鍵後。第二行也是如此。

各系統控制字符鍵值可能不一樣,主要取決於其映射方式(例如使用terminfo或termcap)。
若是要在文本文件中插入控制字符F1鍵,使用vi查看其鍵值,操做以下:
• 啓動vi。
• 進入插入模式。
• 按下<Ctrl>鍵,而後按<v>鍵(出現a^)。
• 釋放上述兩個鍵。
• 按下F1鍵(顯示[OP]。
• 按下<ESC>鍵(顯示F1鍵值)。

10. 使用系統sed
前面已經講述了sed的基本功能,可是在腳本或命令行中使用sed真正要作的是修改或刪除文件或字符串中文本。下面運用前面學過的知識講述這一點。

10.1 處理控制字符
使用sed實現的一個重要功能是在另外一個系統中下載的文件中剔除控制字符。
下面是傳送過來的文件( d o s .txt)的部分腳本。必須去除全部可疑字符,以便於賬號全部者使用文件。
$cat dos.txt
12322##DISO##45.12^M
00332##LPSO##23.11^M
01299##USPD##34.46^M

可採起如下動做:
1) 用一個空格替換全部的(##)符號。
2) 刪除起始域中最前面的0(00)。
3) 刪除行尾控制字符(^M)。
一些系統中,回車符爲^@和^L,若是遇到一些怪異的字符,沒必要擔憂,只要是在行尾而且全都相同就能夠。

按步執行每一項任務,以保證在進行到下一任務前獲得理想結果。使用輸入文件dos.txt。
任務1。刪除全部的#字符很容易,可使用全局替換命令。這裏用一個空格替換兩個或更多的#符號。
$sed 's/##*//g' dos.txt

任務2。刪除全部行首的0。使用^符號表示模式從行首開始, ^0*表示行首任意個0。模式s/^0*//g設置替換部分爲空,即爲刪除模式,正是要求所在。
$sed 's/^0*//g' dos.txt

任務3。最後去除行尾^M符號,爲此需作全局替換。設置替換部分爲空。模式爲:'s/^m//g',注意'^M',這是一個控制字符。
要產生控制字符(^M),需聽從前面產生F1鍵一樣的處理過程。步驟以下;鍵入sed s/,而後按住<Ctrl>鍵和v鍵,釋放v鍵,再按住^鍵,並保持<Ctrl>鍵不動,再釋放兩個鍵,最後按<return>鍵。下面命令去除行尾^M字符。
$sed 's/^M//g dos.txt

分步測試預想功能對理解整個過程頗有幫助。用sed在移到下一步前測試本步功能及結果很重要。若是不這樣,可能會有一大堆包含怪異字符的意料外的結果。
將全部命令結合在一塊兒,使用管道將c a t命令結果傳入一系列sed命令,sed命令與上面幾步精確過濾字符的sed相同。
$cat dos.txt |sed 's/^0*//g' |sed 's/^M//g' |sed 's/##*//g'
如今文件對賬號管理者可用。
能夠將命令放在文件裏,而後運行它。下面即爲轉換腳本。
$cat dos.sed
#!/bin/sed -f
#name:doc.sed
#to call;dos.sed dos.txt

#get rid of the hash marks
s/##//g

#now get rid of the leading zeros
s/^0*//g

#now get rid of the carriage return
#the ^M is generated like we did for the F1 key.
s/\^M//g
經過僅指定一個sed命令能夠將命令行縮短,本書後面部分介紹腳本中sed的用法。

10.2 處理報文輸出
當從數據庫中執行語句輸出時,一旦有了輸出結果,腳本便可作進一步處理。一般先作一些整理,下面是一個sql查詢結果。
database    size(MB)    Date Created
----------------------------------------------------
GOSOUTH     2244        12/11/97
TRISUD      5632        8/9/99
(2 rows affected)
爲了使用上述輸出信息作進一步自動處理,須要知道所存數據庫名稱,爲此需執行如下操做:

1) 使用s/-*//g刪除橫線------。
2) 使用/^$/d刪除空行。
3) 使用$d刪除最後一行
4) 使用1d刪除第一行。
5) 使用awk {print $1}打印第一列。
命令以下,這裏使用了cat,並管道傳送結果到sed命令。
$cat sql.text |sed 's/--*//g' |sed '/^$/d' |sed '$d' |sed '1d' |awk '{print $1}'
GOSOUTH
TRISUD

10.3 去除行首數字
對接下來卸載的這個文件實施的操做是去除行首全部數字,每一個記錄應以UNH或UND開頭,而不是UNH或UND前面的數字。文件以下:
$cat UNH.TXT
12345UND SPLLFC 234344
9999999UND SKKLT   3423
1UND SPLLY   434
...

使用基本正則表達式完成這個操做。[0-9]表明行首任意數字,替換部分爲空格是爲了確保刪除前面的匹配模式,即數字。
$sed 's/^[0-9]//g' UNH.txt
UND SPLLFC 234344
UND SKKLT   3423
UND SPLLY  434

10.4 附加文本
當賬戶完成設置一個文件時,賬號管理者可能要在文件中每一個賬號後面加一段文字,下面是此類文件的一部分:
$cat ok.txt
AC456
AC492169
AC9967
AC88345

任務是在每一行末尾加一個字符串'passed'。
使用$命令修改各域會使工做相對容易些。首先須要匹配至少兩個或更多的數字重複出現,這樣將全部的賬號加進匹配模式。
$sed 's/[0-9][0-9]*/& Passed/g' ok.txt
AC456 Passed
AC492169 Passed
AC9967 Passed
AC88345 Passed

10.5 從shell向sed傳值
要從命令行中向sed傳值,值得注意的是用雙引號,不然功能不執行。
$NAME='It's a go situation"
$REPLACE="GO"
$echo $NAME |sed "s/go/$REPLACE/g"
It's a GO situation

10.6 從sed輸出中設置shell變量
從sed輸出中設置s h e l l變量是一個簡單的替換過程。運用上面的例子,建立shell變量NEW-NAME,保存上述sed例子的輸出結果。
$NAME='It's a go situation"
$REPLACE="GO"
$NEW_NAME=`echo $NAME |sed "s/go/$REPLACE/g"`
$echo $NAME
It's a GO situation

10.11 快速一行命令
下面是一些一行命令集。([]表示空格, [ ]表示tab鍵)
-----------------------------------------------------------------
's/\.$//g'         刪除以句點結尾行
'-e /abcd/d'       刪除包含a b c d的行
's/[][][]*/[]/g'   刪除一個以上空格,用一個空格代替
's/^[][]*//g'      刪除行首空格
's/\.[][]*/[]/g'   刪除句點後跟兩個或更多空格,代之以一個空格
'/^$/d'            刪除空行
's/^.//g'          刪除第一個字符
's/COL\(...\)//g'  刪除緊跟C O L的後三個字母
's/^\///g'         從路徑中刪除第一個\
's/[]/[]//g'       刪除全部空格並用t a b鍵替代
'S/^[]//g'         刪除行首全部t a b鍵
's/[]*//g'         刪除全部t a b鍵

在結束這一章前,看看一行腳本的一些例子。
1. 刪除路徑名第一個\符號
將當前工做目錄返回給sed,刪除第一個\:
cd /usr/local
$echo $PWD |sed 's/^\///g'
$usr/local

2. 追加/插入文本
將"Mr Willis "字串返回給sed並在Mr後而追加"Bruce"。
$echo "Mr Willis" |sed 's/Mr /& Bruce/g'
Mr Bruce Willis

3. 刪除首字符
sed刪除字符串「accounts.doc」首字符。
$echo "accounts.doc" |sed 's/^.//g'
$ccount.doc

4. 刪除文件擴展名
sed刪除「accounts.doc」文件擴展名。
$dcho "accounts.doc" |sed 's/.doc//g'
accounts

5. 增長文件擴展名
sed附加字符串".doc"到字符串"accounts"。
$echo "accounts" |sed 's/$/.doc/g'
accounts.doc

6. 替換字符系列
若是變量x含有下列字符串:
$x="Department+payroll%Building G"
$echo $x
$Department+payroll%Building G

若是要實現下列轉換:
+ to 'of'
% to 'located'
sed命令是:
$echo $x |sed 's/\+/ of /g' |sed 's/\% Located at /g'
Department of payroll Located Building G

10.12 小結
sed是一個強大的文本過濾工具。使用sed能夠從文件或字符串中抽取所需信息。正像前面講到的,sed沒必要寫太長的腳本以取得所需信息。本章只講述了sed的基本功能,但使用這些功能就能夠執行許多任務了。
若是使用sed對文件進行過濾,最好將問題分紅幾步,分步執行,且邊執行邊測試結果。
經驗告訴咱們,這是執行一個複雜任務的最有效方式。
sql

相關文章
相關標籤/搜索