版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
sed簡明教程(轉(zhuǎn))2013-03-3015:51:19分類:LINUXsed全名叫streameditor,流編輯器,用程序的方式來編輯文本,相當(dāng)?shù)膆acker啊。sed基本上就是玩正則模式匹配,所以,玩sed的人,正則表達式一般都比較強。同樣,本篇文章不會說sed的全部東西,你可以參看sed的手冊,我這里主要還是想和大家競爭一下那些從手機指縫間或馬桶里流走的時間,用這些時間來學(xué)習(xí)一些東西。當(dāng)然,接下來的還是要靠大家自己雙手。用s命令替換我使用下面的這段文本做演示:$
cat
pets.txtThisismy
cat
my
cat'snameisbettyThisismydog
mydog'snameisfrankThisismyfish
myfish'snameisgeorgeThisismygoat
mygoat'snameisadam把其中的my字符串替換成HaoChen’s,下面的語句應(yīng)該很好理解(s表示替換命令,/my/表示匹配my,/HaoChen’s/表示把匹配替換成HaoChen’s,/g表示一行上的替換所有的匹配):$
sed
"s/my/HaoChen's/g"
pets.txtThisisHaoChen's
cat
HaoChen'scat'snameisbettyThisisHaoChen'sdog
HaoChen'sdog'snameisfrankThisisHaoChen'sfish
HaoChen'sfish'snameisgeorgeThisisHaoChen'sgoat
HaoChen'sgoat'snameisadam注意:如果你要使用單引號,那么你沒辦法通過\’這樣來轉(zhuǎn)義,就有雙引號就可以了,在雙引號內(nèi)可以用\”來轉(zhuǎn)義。再注意:上面的sed并沒有對文件的內(nèi)容改變,只是把處理過后的內(nèi)容輸出,如果你要寫回文件,你可以使用重定向,如:$
sed
"s/my/HaoChen's/g"
pets.txt>hao_pets.txt或使用-i參數(shù)直接修改文件內(nèi)容:$
sed
-i
"s/my/HaoChen's/g"
pets.txt在每一行最前面加點東西:$
sed
's/^/#/g'
pets.txt#Thisismycat#
mycat'snameisbetty#Thisismydog#
mydog'snameisfrank#Thisismyfish#
myfish'snameisgeorge#Thisismygoat#
mygoat'snameisadam在每一行最后面加點東西:$
sed
's/$/---/g'
pets.txtThisismy
cat
---
my
cat'snameisbetty---Thisismydog---
mydog'snameisfrank---Thisismyfish---
myfish'snameisgeorge---Thisismygoat---
mygoat'snameisadam---順手介紹一下正則表達式的一些最基本的東西:^表示一行的開頭。如:/^#/以#開頭的匹配。$表示一行的結(jié)尾。如:/}$/以}結(jié)尾的匹配。\<表示詞首。如
\<abc表示以abc為首的詞。\>表示詞尾。如abc\>表示以abc結(jié)尾的詞。.表示任何單個字符。*表示某個字符出現(xiàn)了0次或多次。[]字符集合。如:[abc]表示匹配a或b或c,還有[a-zA-Z]表示匹配所有的26個字符。如果其中有^表示反,如[^a]表示非a的字符正規(guī)則表達式是一些很牛的事,比如我們要去掉某html中的tags:html.txt1<b>This</b>iswhat<span
style="text-decoration:underline;">I</span>meant.Understand?看看我們的sed命令#如果你這樣搞的話,就會有問題$
sed
's/<.*>//g'
html.txt
Understand?#要解決上面的那個問題,就得像下面這樣。#其中的'[^>]'指定了除了>的字符重復(fù)0次或多次。$
sed
's/<[^>]*>//g'
html.txtThisiswhatImeant.Understand?我們再來看看指定需要替換的內(nèi)容:$
sed
"3s/my/your/g"
pets.txtThisismy
cat
my
cat'snameisbettyThisisyourdog
mydog'snameisfrankThisismyfish
myfish'snameisgeorgeThisismygoat
mygoat'snameisadam下面的命令只替換第3到第6行的文本。$
sed
"3,6s/my/your/g"
pets.txtThisismy
cat
my
cat'snameisbettyThisisyourdog
yourdog'snameisfrankThisisyourfish
yourfish'snameisgeorgeThisismygoat
mygoat'snameisadam$
cat
my.txtThisismy
cat,my
cat'snameisbettyThisismydog,mydog'snameisfrankThisismyfish,myfish'snameisgeorgeThisismygoat,mygoat'snameisadam只替換每一行的第一個s:$
sed
's/s/S/1'
my.txtThiSismy
cat,my
cat'snameisbettyThiSismydog,mydog'snameisfrankThiSismyfish,myfish'snameisgeorgeThiSismygoat,mygoat'snameisadam只替換每一行的第二個s:$
sed
's/s/S/2'
my.txtThisiSmy
cat,my
cat'snameisbettyThisiSmydog,mydog'snameisfrankThisiSmyfish,myfish'snameisgeorgeThisiSmygoat,mygoat'snameisadam只替換第一行的第3個以后的s:$
sed
's/s/S/3g'
my.txtThisismy
cat,my
cat'SnameiSbettyThisismydog,mydog'SnameiSfrankThisismyfiSh,myfiSh'SnameiSgeorgeThisismygoat,mygoat'SnameiSadam多個匹配如果我們需要一次替換多個模式,可參看下面的示例:(第一個模式把第一行到第三行的my替換成your,第二個則把第3行以后的This替換成了That)$
sed
'1,3s/my/your/g;3,$s/This/That/g'
my.txtThisisyour
cat,your
cat'snameisbettyThisisyourdog,yourdog'snameisfrankThatisyourfish,yourfish'snameisgeorgeThatismygoat,mygoat'snameisadam上面的命令等價于:(注:下面使用的是sed的-e命令行參數(shù))sed
-e
'1,3s/my/your/g'
-e
'3,$s/This/That/g'
my.txt我們可以使用&來當(dāng)做被匹配的變量,然后可以在基本左右加點東西。如下所示:$
sed
's/my/[&]/g'
my.txtThisis[my]
cat,[my]
cat'snameisbettyThisis[my]dog,[my]dog'snameisfrankThisis[my]fish,[my]fish'snameisgeorgeThisis[my]goat,[my]goat'snameisadam圓括號匹配使用圓括號匹配的示例:(圓括號括起來的正則表達式所匹配的字符串會可以當(dāng)成變量來使用,sed中使用的是\1,\2…)$
sed
's/Thisismy\([^,]*\),.*is\(.*\)/\1:\2/g'
my.txtcat:bettydog:frankfish:georgegoat:adam上面這個例子中的正則表達式有點復(fù)雜,解開如下(去掉轉(zhuǎn)義字符):正則為:Thisismy([^,]*),.*is(.*)匹配為:Thisismy(cat),……….is(betty)然后:\1就是cat,\2就是bettysed的命令讓我們回到最一開始的例子pets.txt,讓我們來看幾個命令:N命令先來看N命令——把下一行的內(nèi)容納入當(dāng)成緩沖區(qū)做匹配。下面的的示例會把原文本中的偶數(shù)行納入奇數(shù)行匹配,而s只匹配并替換一次,所以,就成了下面的結(jié)果:$
sed
'N;s/my/your/'
pets.txtThisisyour
cat
my
cat'snameisbettyThisisyourdog
mydog'snameisfrankThisisyourfish
myfish'snameisgeorgeThisisyourgoat
mygoat'snameisadam也就是說,原來的文件成了:Thisismy
cat\n
my
cat'snameisbettyThisismydog\n
mydog'snameisfrankThisismyfish\n
myfish'snameisgeorgeThisismygoat\n
mygoat'snameisadam這樣一來,下面的例子你就明白了,$
sed
'N;s/\n/,/'
pets.txtThisismy
cat,
my
cat'snameisbettyThisismydog,
mydog'snameisfrankThisismyfish,
myfish'snameisgeorgeThisismygoat,
mygoat'snameisadama命令和i命令a命令就是append,i命令就是insert,它們是用來添加行的。如:#其中的1i表明,其要在第1行前插入一行(insert)$
sed
"1iThisismymonkey,mymonkey'snameiswukong"
my.txtThisismymonkey,mymonkey'snameiswukongThisismy
cat,my
cat'snameisbettyThisismydog,mydog'snameisfrankThisismyfish,myfish'snameisgeorgeThisismygoat,mygoat'snameisadam#其中的1a表明,其要在最后一行后追加一行(append)$
sed
"$aThisismymonkey,mymonkey'snameiswukong"
my.txtThisismy
cat,my
cat'snameisbettyThisismymonkey,mymonkey'snameiswukongThisismydog,mydog'snameisfrankThisismyfish,myfish'snameisgeorgeThisismygoat,mygoat'snameisadam我們可以運用匹配來添加文本:#注意其中的/fish/a,這意思是匹配到/fish/后就追加一行$
sed
"/fish/aThisismymonkey,mymonkey'snameiswukong"
my.txtThisismy
cat,my
cat'snameisbettyThisismydog,mydog'snameisfrankThisismyfish,myfish'snameisgeorgeThisismymonkey,mymonkey'snameiswukongThisismygoat,mygoat'snameisadam下面這個例子是對每一行都挺插入:$
sed
"/my/a----"
my.txtThisismy
cat,my
cat'snameisbetty----Thisismydog,mydog'snameisfrank----Thisismyfish,myfish'snameisgeorge----Thisismygoat,mygoat'snameisadam----c命令c命令是替換匹配行$
sed
"2cThisismymonkey,mymonkey'snameiswukong"
my.txtThisismy
cat,my
cat'snameisbettyThisismymonkey,mymonkey'snameiswukongThisismyfish,myfish'snameisgeorgeThisismygoat,mygoat'snameisadam$
sed
"/fish/cThisismymonkey,mymonkey'snameiswukong"
my.txtThisismy
cat,my
cat'snameisbettyThisismydog,mydog'snameisfrankThisismymonkey,mymonkey'snameiswukongThisismygoat,mygoat'snameisadamd命令刪除匹配行$
sed
'/fish/d'
my.txtThisismy
cat,my
cat'snameisbettyThisismydog,mydog'snameisfrankThisismygoat,mygoat'snameisadam$
sed
'2d'
my.txtThisismy
cat,my
cat'snameisbettyThisismyfish,myfish'snameisgeorgeThisismygoat,mygoat'snameisadam$
sed
'2,$d'
my.txtThisismy
cat,my
cat'snameisbettyp命令打印命令你可以把這個命令當(dāng)成grep式的命令#匹配fish并輸出,可以看到fish的那一行被打了兩遍,#這是因為sed處理時會把處理的信息輸出$
sed
'/fish/p'
my.txtThisismy
cat,my
cat'snameisbettyThisismydog,mydog'snameisfrankThisismyfish,myfish'snameisgeorgeThisismyfish,myfish'snameisgeorgeThisismygoat,mygoat'snameisadam#使用n參數(shù)就好了$
sed
-n
'/fish/p'
my.txtThisismyfish,myfish'snameisgeorge#從一個模式到另一個模式$
sed
-n
'/dog/,/fish/p'
my.txtThisismydog,mydog'snameisfrankThisismyfish,myfish'snameisgeorge#從第一行打印到匹配fish成功的那一行$
sed
-n
'1,/fish/p'
my.txtThisismy
cat,my
cat'snameisbettyThisismydog,mydog'snameisfrankThisismyfish,myfish'snameisgeorge幾個知識點好了,下面我們要介紹四個sed的基本知識點:PatternSpace第零個是關(guān)于-n參數(shù)的,大家也許沒看懂,沒關(guān)系,我們來看一下sed處理文本的偽代碼,并了解一下PatternSpace的概念:foreachlineinfile{
//放入把行Pattern_Space
Pattern_Space<=line;
//對每個patternspace執(zhí)行sed命令
Pattern_Space<=EXEC(sed_cmd,Pattern_Space);
//如果沒有指定-n則輸出處理后的Pattern_Space
if
(sedoptionhasn't
"-n")
{
printPattern_Space
}}Address第一個是關(guān)于address,幾乎上述所有的命令都是這樣的(注:其中的!表示匹配成功后是否執(zhí)行命令)[address[,address]][!]{cmd}address可以是一個數(shù)字,也可以是一個模式,你可以通過逗號要分隔兩個address表示兩個address的區(qū)間,參執(zhí)行命令cmd,偽代碼如下:bool
bexec=
falseforeachlineinfile{
if
(match(address1)){
bexec=
true;
}
if
(bexec==
true){
EXEC(sed_cmd);
}
if
(match(address2)){
bexec=
false;
}}關(guān)于address可以使用相對位置,如:#其中的+3表示后面連續(xù)3行$
sed
'/dog/,+3s/^/#/g'
pets.txtThisismy
cat
my
cat'snameisbetty#Thisismydog#
mydog'snameisfrank#Thisismyfish#
myfish'snameisgeorgeThisismygoat
mygoat'snameisadam命令打包第二個是cmd可以是多個,它們可以用分號分開,可以用大括號括起來作為嵌套命令。下面是幾個例子:$
cat
pets.txtThisismy
cat
my
cat'snameisbettyThisismydog
mydog'snameisfrankThisismyfish
myfish'snameisgeorgeThisismygoat
mygoat'snameisadam#對3行到第6行,執(zhí)行命令/This/d$
sed
'3,6{/This/d}'
pets.txtThisismy
cat
my
cat'snameisbetty
mydog'snameisfrank
myfish'snameisgeorgeThisismygoat
mygoat'snameisadam#對3行到第6行,匹配/This/成功后,再匹配/fish/,成功后執(zhí)行d命
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 案件辦理委托協(xié)議
- 貴州省六盤水市2025屆高三第二次診斷性監(jiān)測考試語文試題
- 感恩同行青春追夢
- 2025年全球及中國升降式傳遞窗行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025-2030全球沖壓飛輪行業(yè)調(diào)研及趨勢分析報告
- 2025年全球及中國天窗玻璃更換和維修行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025年全球及中國量子信息系統(tǒng)服務(wù)行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025年度食品飲料代理銷售服務(wù)合同
- 二零二五年度石油化工設(shè)備采購代理協(xié)議3篇
- 數(shù)字化工作空間與創(chuàng)新園區(qū)的未來展望
- 2023年高考英語考前必練-非謂語動詞(含近三年真題及解析)
- 風(fēng)電工程需要編寫的專項施工方案及危大工程目錄
- 商業(yè)計劃書(BP)財務(wù)計劃風(fēng)險控制資本退出與附錄的撰寫秘籍
- 全國職工拔河比賽執(zhí)行方案
- 冶金廠、軋鋼廠工藝流程圖
- 七年級下冊《Reading 1 A brave young man》優(yōu)質(zhì)課教案牛津譯林版-七年級英語教案
- 中國人婚戀狀況調(diào)查報告公布
- 《木蘭詩》第1第2課時示范公開課教學(xué)PPT課件【統(tǒng)編人教版七年級語文下冊】
- GB/T 11144-2007潤滑液極壓性能測定法梯姆肯法
- 國家開發(fā)銀行
- 板帶生產(chǎn)工藝5(熱連軋帶鋼生產(chǎn))課件
評論
0/150
提交評論