標籤:style 使用 strong os 檔案 資料
sed,stream editor,流編輯器,輸入一段文本,通過處理,得到修改的文本,一個很簡單卻又很複雜的功能,簡單在於只是處理文本,複雜在於需要支援文本處理的全部要求,增刪查改等功能。
源檔案file,下列操作都是以此檔案操作:
firstsecondthirdfirst sed
增:
增加一行文字:sed ‘1 a this is a line‘ file;a代表append;
firstthis is a linesecondthirdfirst sed
插入一行文字:sed ‘1 i this is a line‘ file;i代表insert;
this is a linefirstsecondthirdfirst sed
在行首或行尾增加一個單詞:sed ‘s/^/#/‘ file;s代表substitute,^代表行首,$代表行尾;
#first#second#third#first sed
刪:
刪除一行文字:sed ‘2 d‘ file;d代表delete;
firstthirdfirst sed
刪除多行文字:sed ‘2,3 d‘ file;2,3代表起始行號和終止行號;
firstfirst sed
刪除某個單詞:sed ‘s/first//g‘ file;g代表global;替換全部first為空白,如果是數字n,則替換第n個first,如果是數字n和g,如2g,則替換第n個之後的first;
secondthird sed
查:
列印某行:sed -n ‘2 p‘ file;p代表print;
second
列印多行:sed -n ‘1,2 p‘ file;-n選項代表不輸出模式空間的資料(什麼是模式空間後面會說);
firstsecond
列印包含某個單詞的行: sed -n ‘/first/p‘ file;匹配first,也可以使用Regex;
firstfirst sed
列印包含A單詞又包含B單詞的行:sed -n ‘{/first/{/sed/p}}‘ file;大括弧{}代表嵌套命令,先匹配first,在匹配sed,然後p,或者用d刪除等都可以;
first sed
列印包含A單詞卻不包含B單詞的行:sed -n ‘{/first/{/sed/!p}}‘ file;驚嘆號!代表非,反操作;
first
列印包含A單詞的後續幾行:sed -n ‘/second/,+1p‘ file;+1代表後續一行;
secondthird
列印奇數或偶數行:sed -n ‘p;n‘ file;sed -n ‘n;p‘ file;前者奇數行,後者偶數行;分號;代表執行多個sed命令,使用-e選項,如sed -e ‘……‘ -e ‘……‘ file 也有同樣效果;至於n命令後面會談到。
firstthird
secondfisrt sed
改:
將A修改為B:sed ‘ s/first/one/g‘ file;
onesecondthirdone sed
將某行從小寫轉換為大寫:sed ‘2 y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/‘ file;y代表yank(猜測與vim的y代表的意思是差不多的);其實就是映射,a映射為A,b映射為B;
firstSECONDthirdfirst sed
替換某行的文字:sed ‘1 c abc‘ file;c代表change;
abcsecondthirdfirst sed
以上是sed的一些使用例子,下面談談它的其它內容。
pattern space(模式空間)與選項-n
模式空間在sed裡對初學者是特別難懂的一個東西,說白了,它就是一個緩衝區,將資料讀入緩衝區,在緩衝區處理,並輸出緩衝區的內容,這也就是為什麼不會修改源檔案的內容。
至於選項-n,要求sed不輸出緩衝區的內容,大部分都只有列印時才會使用,大致流程如下虛擬碼:
for line in file //迴圈讀入每行資料 do pattern_space = line //將當前行資料寫入模式空間 pattern_space = exec(sed_cmd,pattern_space) //執行sed的命令,並將處理完的資料寫回模式空間 if "-n" no exist //如果沒有選項-n print pattern_space //則輸出模式空間的資料 done
選項-i,直接修改源檔案
上述的sed操作執行都不會對源檔案作任何改動,相當於copy了一個副本出來操作相應的命令,但如果我們需要直接在源檔案上修改,該怎麼辦,查man會知道,-i選項會使命令在源檔案上操作。
地址
在使用sed,命令的格式都類似這樣,“1,2s/a//g”,"2p","1,3d","/wo/,+3p","2!p","p";sed處理的資料,都有起始行,到結束行,限定一定的地區,大致的格式是這樣,[begin,[end]][!]cmd,begin或end可以由數字或者正則式表示。
n與N
看別人的sed腳步,有時會看到n與N命令,類似這樣的,sed -n ‘n;p‘ file,代表輸出偶數行,單獨的一個p肯定是輸出全部的,那多了個n為什麼就是偶數行?瞭解一下n或N命令做了什麼事。
g與G、h與H、x
這幾個命令,與另一概念有關,hold space,相當於模式空間的緩衝區,與n/N命令相似,g與h都是覆蓋,G與H都是追加;
g: 將hold space中的內容拷貝到pattern space中,原來pattern space裡的內容清除
G: 將hold space中的內容append到pattern space\n後
h: 將pattern space中的內容拷貝到hold space中,原來的hold space裡的內容被清除
H: 將pattern space中的內容append到hold space\n後
x: 交換pattern space和hold space的內容
舉個栗子:
|
pattern space
|
hold space |
| 原 |
abc |
\n |
| g |
\n
|
\n |
| G |
abc\n
|
\n |
| h |
abc |
abc |
| H |
abc |
\nabc |
| x |
\n |
abc |
附:
使用的一些相關正則:
(^):開頭
($):結尾
(\<):詞首
(\>):詞尾
(.):任何單字元
(*):某個字元出現0次或多次
([ ]):字元集合
(&):被匹配的變數
(=):行號