2017-08-25 17 views
1

我嘗試下面的命令上終端
echo "aa" | sed -r 's/o*/_/g'
結果是這樣
_a_a_
什麼我預計是
__ 當第一a被讀取,這意味着有零o使a將由_SED -r(例如回聲 「AA」 | SED -r 'S/O */_/G')

被替換如果我使用
echo "aoooa" | sed -r 's/o+/_/g'
結果是我所期待的 a_a

但是當我使用
echo "aoooa" | sed -r /s/o*/_/g
結果是 _a_a_
我覺得應該是_a_a並沒有最後_

我完全不知道爲什麼有3個下劃線。有誰能告訴我這個特定案例的運行過程嗎?

+2

請編輯你Q顯示你**做**期望的輸出。並且回想一下'*'意味着零或更多的前面的文本對象,強調零或多個。當然,你爲什麼期望's/o/g'改變'a'(或者'l',就像你在主題中的那樣)?祝你好運。 – shellter

+0

當它讀取第一個'a'時,我認爲滿足條件'o *'是因爲沒有'o'並且'a'將被替換爲'_' –

+0

如果您試圖用'_'替換'a' ''sed's/a/_/g''應該足夠了。 如果你想替換任何字母(a-z),那麼你可以使用's/[a-z]/_/g'' – derp

回答

2

[從我的評論:] o*不匹配「a」,它匹配「a」之前的零長度字符串(以及「a」之間的零長度字符串和第二個「a」之後的零長度字符串)。 「a」表示比賽結束,但不是比賽的一部分,因此不會被替換。

爲了使這更清晰,考慮當有的「O」 S啓用會發生什麼(我用大寫字母「A」 s到使他們更可見):

$ echo "ooooAooooAoooo" | sed 's/o*/_/g' 
_A_A_ 

...每個「o」組被替換爲單個「_」; 「A」結束了前兩個小組,但他們不是小組的一部分(他們在小組之間),所以他們一個人留下。

如果只是一個「O」組中,同樣的事情發生了:

$ echo "oAoAo" | sed 's/o*/_/g' 
_A_A_ 

...最後,用無「O」 S(即用「O」零長度組s):

$ echo "AA" | sed 's/o*/_/g' 
_A_A_ 

...再次,「A」不是匹配的一部分,所以它們不會被替換。

0

如果需要輸出是什麼,開始與鄰,以下劃線在不是Ø信,你可以使用:

echo "abcdefhijklmnopqrstuvwxyzoo" | sed -r 's/[^o]/_/g'   

輸出:_____________o___________oo