引言:
Sed命令是linux里用于文本行處理的命令。
為了便于說明,我在/usr/dict下創(chuàng)建了字典Words并以此作為演示模板
先用nl 打印下words內(nèi)容:

*打印篇:
Q1:如何打印某一行數(shù)據(jù)?
如果要打印第一行數(shù)據(jù),則使用:
sed –n 1p words
如果要打印最后一行數(shù)據(jù),則使用:
sed –n ‘$p’ words
注意的是:如果是某個具體的行號,并不需要加引號,如果含’$’等特殊字符或某些模式匹配的時候需要加引號。
你會想,僅僅是能看到頭行和結(jié)尾行的數(shù)據(jù),有什么稀奇的?試想如果一個文本,比如一個‘龐大’的log,僅僅是要看第10000行的數(shù)據(jù),怎么去看?如果一頁頁去找會很麻煩,同時打開很大的文件去查找也是不現(xiàn)實的。這時用sed命令就非常方便。看!
sed -n 10000p words
Q2:打印連續(xù)的行?
打印連續(xù)行只要這么寫:
sed –n 2,6p words
表示打印2-6行的數(shù)據(jù)
打印從第5行道結(jié)尾的數(shù)據(jù),這么寫:
sed –n ‘5,$p’ words
Q2:怎樣打印不連續(xù)的行?
比如我想只打印第5、8、10數(shù)據(jù):

這里用到了“-e”參數(shù),每個-e 后面都可以表達(dá)式+執(zhí)行動作,sed按順序執(zhí)行。
Q3:打印包含指定字符(模式匹配)的行?
當(dāng)我們在一個龐大的文檔中查找數(shù)據(jù)時,往往不知道要查找的東西在哪行,我們知道的可能是某行數(shù)據(jù)包含什么字符串或者符合什么樣的規(guī)律,這時要用到模式匹配,把要匹配的格式放在兩個’/’之間,如下:
/pattern-text/
。比如要查看含’abc’的行:
sed –n /abc/p words
要查看包含3個連續(xù)相同字符的行:
sed –n ‘//(/w/)/1/1/p’ words

Q4:打印行號?
sed命令可以打印匹配行的行號:
sed –n /aaa/= words,”p”換成”=”,表示打印行號。
*新增篇
Q1:在某一行后添加新行要怎么做?
比如sedtest下有三個腳本:

寫這些腳本的人都是一個作者,作者寫完后發(fā)現(xiàn)有必要在源碼中留下自己的大名。于是他這樣做:
sed –in ‘1a #author is elvis’ sh01.sh sh02.sh sh03.sh
加上-i表示修改的內(nèi)容直接‘寫回’文檔而不在屏幕輸出
1a表示在第一行后插入新行,這是因為第一行往往是’#!’行。也可以把1a換為2i,表示在第二行前插入一行(當(dāng)然默認(rèn)了一個腳本文件至少有2行)

加上大名后作者還不滿意,想一次性地把版本和日期信息加上并且加上一行注釋‘This is for test’。sed也能一次性地添加多行,可以直接在后面添加換行符/n,也可以通過在shell中輸入【/+回車】分開每行的輸入:

除此之外,sed還可以讀取一個文本文件的內(nèi)容并追加到指定行的后面:
比如要在3個腳本文件末尾追加sh04.sh的內(nèi)容:
sed –in ‘$r sh04.sh’ sh01.sh sh02.sh sh03.sh
sh04.sh中寫了很多內(nèi)容,包括定義了一些方法,比如sh04.sh中定義了bomb方法。通過上面的命令就可以把這個方法插入了3個腳本的末尾。

*刪除篇
利用sed命令可以輕松刪除文本文件中指定的行。
用法是:sed n1,n2d textfilepath;或sed ‘/pattern-text/d’ textfilepath
比如:我想查看一個shell腳本,但是不想看注釋,同時不打印空行,可以這么做;

細(xì)心的你可能會發(fā)現(xiàn)我少加了”-n”參數(shù),在打印和新增的時候通常要加上”-n”參數(shù),因為”-n“表示是只輸出匹配的行。
我們改寫上面的案例,看下打印如果不加這項參數(shù)會怎樣。

咦?怎么還是把所有的打印出來了?而且還重復(fù)打印了!
這是因為原始行在非安靜模式下是會輸出,顯示不符合我們想要的結(jié)果。加上”-n”就”安靜“多了!

由于刪除的動作,是顯示刪除后原始行的數(shù)據(jù),所以不需要加”-n“,如果加了將看不到任何效果。

*修改篇
sed命令可以修改一個文本文檔的數(shù)據(jù)。
1、 整行取代
sed n1,n2c textfilepath

比如我要把words中的空行用三個’#’代替,可以這么做:

2、 局部修改
正則表達(dá)式是個利器,它成就了像sed,awk這樣的強大的文本工具。sed可以通過匹配修改一個文本文檔中任何你想修改的地方,比如:
words中每一行單詞首字母都不是大寫,通過sed命令就可以完善這一點,看!

比如,我想把words中每個全數(shù)字的單詞都加上”0x“前綴:

*番外篇
1、小結(jié):
通過上面的介紹,總結(jié)sed的用法規(guī)律,
sed [–nrfe] + 正則表達(dá)式或行號+執(zhí)行動作 + 文件,執(zhí)行動作用a,c,i這類的字符標(biāo)識。
同時sed也是一個管道命令,所謂管道(pipe)命令,簡單的理解是不僅可以產(chǎn)生數(shù)據(jù),也可以接收和處理別的命令產(chǎn)生的數(shù)據(jù)。
比如一個文檔中有很多重復(fù)行,用sed定位行時沒必要把所有的重復(fù)行打印出來,這時可以先用uniq命令去除重復(fù)行,然后把去除重復(fù)后的數(shù)據(jù)交給sed處理:

2、擴展:
-e、-f、-r參數(shù)的含義和使用
有些人對sed中nrfe這4個參數(shù)不理解,其實理解它們不難,手冊+實踐就搞定。
-n上面已經(jīng)說明了,這里略過。
先用man sed看下參數(shù)的說明:

可以看到-e和-f的作用都是一樣,都是向命令行添加執(zhí)行動作,只不過-e是直接在后面添加表達(dá)式,-f是指定一個腳本文件。
在打印篇已經(jīng)看到了-e的用法,對!一條sed命令可以連續(xù)接好幾個-e exp的,它告訴我們一條sed命令其實做很多事情。
比如修改篇中,我想同時實現(xiàn)轉(zhuǎn)換大寫字母和添加前綴的功能,就可以用-e參數(shù)實現(xiàn):

-f的作用就是指定一個寫滿執(zhí)行動作的文件:
比如我寫了一個sed_PRint文件,里面寫了我要打印某幾行的命令:

我只要在sed命令后指定這個文檔就可以打印第2行、第5行、第8行的數(shù)據(jù),是不是很方便

-r的作用是應(yīng)用擴展的正則表達(dá)式
如果不加這個參數(shù)默認(rèn)使用的基本的正則表達(dá)式,這樣有些語法是無法使用的,比如”+“和”?”。看看下面這個對比就知道了:
比如words不是按行分隔,而是按空格分隔,我想使其中的每個英文單詞的首字母大寫:


上面的正則表達(dá)式用到了“+“,所以必須加”-r“參數(shù)才可,否則就匹配不了,這也是我們在用sed命令時要十分小心的地方。
擴展的正則表達(dá)式到底擴展了哪些東西呢?
除了上面講的+和?外還有:
1、{m,n}字符次數(shù)匹配
2、|,OR匹配

3、(),分組和反向引用

新聞熱點
疑難解答
圖片精選