sed 替換文檔裏的字符

sed 's///g' 與sed 's///' 其實是有很大區別的,要是不注意肯定出錯,請看例子:

題目:刪除一個文件裏開頭的空白

ps:  /^ */ 匹配以空格開頭的字符

    /^\s/  匹配任何空白字符,包括空格、製表符、換頁符等等。等價於[ \f\n\r\t\v]

    /^[[:space:]]*/ 匹配以空格或者是\t製表符開頭的字符

amp1:~ # cat 2   ##這是文件2的內容

       aaaaaaaaaa

       bbbbbbbbbb

cccc  ccccc ccccc 

       dddddd dddddd                    dddddd

yyyyyyyy      yyyyyyyyyyyyy         yyyyyyyyyyyyyy

     ooooooo   ooooooo    oooooo ooooooo

amp1:~ # sed 's/\s*//g' 2  

aaaaaaaaaa

bbbbbbbbbb

cccccccccccccc

dddddddddddddddddd

yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy

ooooooooooooooooooooooooooo

##這裏我們並沒有定義以"\s"開頭

##然後加g,結果連中間的“\s”的字符都已經匹配了

amp1:~ # sed 's/\s*//' 2 

aaaaaaaaaa

bbbbbbbbbb

cccc  ccccc ccccc 

dddddd dddddd                    dddddd

yyyyyyyy      yyyyyyyyyyyyy         yyyyyyyyyyyyyy

ooooooo   ooooooo    oooooo ooooooo

 ##這裏跟上一個相比,沒有加g,結果只是匹配到了開頭的“\s”字符

 ##說明g進行了一個全局的搜索

 ##不帶g的話,只是匹配每行的第一個字段,後面的不管

amp1:~ # sed 's/^\s*//' 2 

aaaaaaaaaa

bbbbbbbbbb

cccc  ccccc ccccc 

dddddd dddddd                    dddddd

yyyyyyyy      yyyyyyyyyyyyy         yyyyyyyyyyyyyy

ooooooo   ooooooo    oooooo ooooooo

##這裏的“^”其實是多餘的

##但是對於不是以空白符、製表符等開頭的字符,加“^”和不加,是有很大區別的,稍後的例子會有說明。

##不帶g的話,本身只會匹配開始的結果

amp1:~ # sed 's/^\s*//g' 2   

aaaaaaaaaa

bbbbbbbbbb

cccc  ccccc ccccc 

dddddd dddddd                    dddddd

yyyyyyyy      yyyyyyyyyyyyy         yyyyyyyyyyyyyy

ooooooo   ooooooo    oooooo ooooooo

##這裏我們指定了以“\s”開頭

##然後加g,結果只會匹配第一個符合的字段,g這裏也是一個全局的作用

##但是匹配的條件指定了“開頭的空白”。所有結果也是正確的。

 從上面的分析,可以的知道在sed命令的s模式中,g是起到一個全局的作用,這個範圍是每一行,也就是說是一行爲單位,作爲一個全局。

     +g :匹配每一行有行首到行尾的所有字符

    不加g:匹配每一行的行首開始匹配,匹配到第一個符合的字段,就會結束,跳到下一行

驗證:

amp1:~ # cat 3.txt  ##3.txt的內容

hello hello hello  

   hello  hello

hello  hello hello

amp1:~ # sed 's/hello/nihao/' 3.txt 

nihao hello hello  

   nihao  hello

nihao  hello hello

##不指定開頭,也不加g,結果是匹配到一個符合的字段就直接跳到下一行

amp1:~ # sed 's/hello/nihao/g' 3.txt ##不指定開頭,加g,匹配全部

nihao nihao nihao  

   nihao  nihao

nihao  nihao nihao

amp1:~ # sed 's/^hello/nihao/' 3.txt 

nihao hello hello  

   hello  hello

nihao  hello hello

##指定開頭,行首的第一個字段必須是"hello",所以第二行的hello不能被匹配到。

amp1:~ # sed 's/^hello/nihao/g' 3.txt ##指定開頭,加全局g,同上

nihao hello hello  

   hello  hello

nihao  hello hello

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