淺嘗sed

文前小記:去年找到工作之後,一直沒時間打理自己的博客,最近在實習,打算把現在學到的一些東西做一個整理,然後繼續耕耘自己的博客,看到一個百度的師兄去美國了,頓時覺得人生其實可以過得不一樣,任何時候都不要對自己放棄

man 一下sed,linux會告訴你sed是一種流編輯器,神馬是流編輯器,我的理解就是它是對文件流,輸入流之類的進行編輯,基本格式:

sed -comm pattern file

如果你不輸入文件,就等待標準輸入流嘍(還是處理文件比較有意義),簡單建立一個文件:

Today is 2014/5/1,Today is a festival
It rained yesterday
tomorrow will be Saturday

我常用的幾種用法:

1.替換命令s

將Today替換爲today

#sed s/Today/today/g sed.txt
today is 2014/5/1,today is a festival
It rained yesterday 
tomorrow will be Saturday

pattern你可以這樣寫,你也可以's/Today/today/g's/Today/today/g‘,你甚至可以”s/Today/today/g's/Today/today/g“,三種用法的區別在於單引號可以解析類似$這樣的正則表達式,建議用單引號,g的作用是替換這行所有的匹配,那就引出了替換一次,兩次怎麼辦?

將第一個Today替換爲today

sed s/Today/today/1 sed.txt 
today is 2014/5/1,Today is a festival
It rained yesterday 
tomorrow will be Saturday

將第二個Today替換爲today

sed s/Today/today/2 sed.txt
Today is 2014/5/1,today is a festival
It rained yesterday 
tomorrow will be Saturday
這個時候我們打開源文件看看,發現源文件竟然沒變,這裏面涉及到了一個概念:模式空間sed其實將處理文件的每一行放入模式空間,然後對模式空間中內容進行處理輸出(vi是把處理的文件都放入內存,但是sed放一行到內存,處理完輸出到屏幕,然後再讀下一行),如果想修改源文件可以使用-i,但是我不推薦這麼做,這恰恰是sed的哲學,萬一你修改了源文件,就回不來了,所以我們通常把處理完的結果重定向到另一個文件,除非你對這次操作很自信啦(^_^)。

文件的開頭都加入#

sed 's/^/#/g' sed.txt
#Today is 2014/5/1,Today is a festival
#It rained yesterday 
#tomorrow will be Saturday
這裏面的^是正則表達式裏面的內容,不熟悉需要自己加油,爲什麼寫這個命令,因爲我們知道python腳本是沒有多行註釋的,這樣我們就可以利用這條語句多行註釋啦(自作聰明瞭一下呵呵)

2.刪除命令d

其次用的比較多的就是刪除命令了,

刪除第一行

sed 1d sed.txt 
It rained yesterday 
tomorrow will be Saturday
刪除含有tomorrow的行

sed '/tomorrow/d' sed.txt 
Today is 2014/5/1,Today is a festival
It rained yesterday
刪除第二行到最後一行

sed '2,$d' sed.txt
Today is 2014/5/1,Today is a festival

3.打印命令p

這個命令就不說了,匹配打印,可以當grep來使用

sed /Today/p sed.txt
Today is 2014/5/1,Today is a festival
Today is 2014/5/1,Today is a festival
It rained yesterday 
tomorrow will be Saturday
我們發現它把模式空間的內容也打印出來了,這裏我們可以使用-n參數

4.插入命令a和i

在某行的前面插入就用i,在某行的後面插入就用a

文件開頭插入BEGIN,結尾插入END

sed  -e '$a END' -e '/Today/i BEGIN' sed.txt
EGIN
Today is 2014/5/1,Today is a festival
It rained yesterday 
tomorrow will be Saturday
END
多個命令的時候我們可以-e來分隔


其它的一些,例如如果找到某個單詞之後想替換這行,就用-c命令

sed '/Today/c this is first line' sed.txt 
this is first line
It rained yesterday 
tomorrow will be Saturday

那如果我找到某個單詞,想將這行的另一個單詞替換掉呢?

sed '/Today/s/is/IS/g' sed.txt
Today IS 2014/5/1,Today IS a festival
It rained yesterday 
tomorrow will be Saturday
是不是有種庖丁解牛的感覺,對每一個單詞都可以這樣做,那如果我不光是替換,還有其它操作呢

比如在這個單詞後面增加一個字母呢?

sed 's/\(Today\)/\1++/g' sed.txt 
Today++ is 2014/5/1,Today++ is a festival
It rained yesterday 
tomorrow will be Saturday
解釋一下,\(Today\)把Today取了出來作爲變量,然後利用\1來取用這個變量,高級吧





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章