sed簡明教程參考資料_第1頁
sed簡明教程參考資料_第2頁
sed簡明教程參考資料_第3頁
sed簡明教程參考資料_第4頁
sed簡明教程參考資料_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論