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
|