5 sed中有選項嗎?有沒有什麼比較常用的?
sed最主要的就是command部分,把這部分玩轉了,你就已經很厲害了,而玩轉這部分的前提是玩轉Regex。儘管如此,sed的選項部分的-n選項仍然是非常重要,理解了它,對於你提高sed水平也是至關重要。
前面提到,sed會將模式空間裡的行經過處理後輸出到標準輸出,這是預設的處理方式。就是說,除非你使用d命令來刪除此行,否則它無論變成什麼樣子,無論它被替換成什麼形狀,它都會多多少少被輸出到螢幕上。前面的例子可以證明這一切。你不信?給你個最能說明問題的例子:
[rocrocket@rocrocket programming]$ cat roc.txt
1
2
3
4
5
[rocrocket@rocrocket programming]$ sed ‘/4/p’ roc.txt
1
2
3
4
4
5
看,除了所有的原始內容都被輸出來了,而且含有字元4的行被重複輸出了一遍。這就是sed的工作原理,它會不問青紅皂白的先把原始行輸出來,然後再執行後面的動作,在這裡我們設定了p,表示列印此行。這種輸出結果不是我們想要的,我們其實想要的是只輸出含有4的行。
這時,如果你使用了-n選項,你會發現,結果如你所願了:
[rocrocket@rocrocket programming]$ sed -n ‘/4/p’ roc.txt
4
選項-n告訴sed,除非是明確表明要輸出的行,否則不要給我胡亂輸出。(這回你知道-n的厲害了吧^_^)
-n一般會和-p配合使用,意思是說輸出那些發生變化的行。
6 command部分感覺很複雜,能給稍微總結一下麼?
command部分是這樣,可以分為兩部分,一部分是確定範圍部分,一部分是處理方式部分。
確定範圍部分可以分為兩種方式:
1 指定行數:例如3,5表示第3、第4和第5行;5,$表示第5行至最後一行;
2 用模式比對進行指定:例如/^[dD]/表示匹配行首不是以d或D開頭的行等等。
處理方式部分呢,有很多命令可用,介紹幾個最常用的吧:
d:表示刪除行
p:列印該行
r:讀取指定檔案的內容
w:寫入指定檔案
a/:在下面插入新行新內容
7 再舉幾個例子吧,給點經典的sed應用。
例一 顯示test檔案的第10到20行:sed -n ‘10,20p’ test
例二 將所有以d或D開頭的行的所有小寫x變為大寫X:sed ‘/^[dD]/s/x/X/g’ test
例三 刪除每行最後的兩個字元:sed ’s/..$//’ test
(有人會問用sed ‘/..$/d’ test為什麼不行? 這是因為/..$/表示匹配所有末尾含有兩個字元的行,然後刪除這樣的行,顯然這是錯誤的)
例四 刪除每一行的前兩個字元:sed ’s/..//’ test