2013-11-20 77 views
0

以下是我的測試用例。我試圖匹配並打印在第一個=之後發生的字符串,忽略了前導空白和尾隨空白。我的問題是我不知道如何match up to trailing white spaces or the end of line。它似乎與領先的工作很好,但尾隨的空間在某種程度上是有問題的。我猜它有事情做與優先順序,但我不能由我自己看着辦吧:如果我把這些空間作爲空間的__代替[[:blank:]]*表達作品BRE如何匹配行結束處的空白空間?

echo "TITLE= B=ack=To ian " | sed -n -e 's/[^=]*=[[:blank:]]*\(.*\)[[:blank:]]*$/\1/p' | od -tx1 -tc 

0000000 42 3d 61 63 6b 3d 54 6f 20 69 61 6e 20 20 20 0a 
      B = a c k = T o  i a n    \n 

有趣,但它失去它的靈活性:

echo "TITLE= B=ack=To ian " | sed -n -e 's/[^=]*=[[:blank:]]*\(.*\) $/\1/p' | od -tx1 -tc 

0000000 42 3d 61 63 6b 3d 54 6f 20 69 61 6e 0a 
      B = a c k = T o  i a n \n 

ps,我對如何用Perl的正則表達式或其他工具不感興趣,我想了解爲什麼會發生這種情況。

感謝

+0

嘗試使用'\ s *'而不是'[:blank:] *'。 '\ s'不僅與製表符和空格相匹配,而且還包含換行符。查看[此列表](http://en.wikipedia.org/wiki/Regular_expression#Character_classes)。 – Broxzier

+0

謝謝,但我試圖讓我的腳本POSIX兼容和'\ s *'不是POSIX據我所知。 – user3014381

+0

然後嘗試'[:space:]'。 – Broxzier

回答

1

你可以試試這個:

echo "TITLE= B=ack=To ian " | sed -n -e 's/[^=]*=[[:blank:]]*\(.*[^[:blank:]]\)[[:blank:]]*$/\1/p' | od -tx1 -tc 

由於量詞*是貪婪的,它趕上一切所能。當你寫\(.*\)[[:blank:]]*$,因爲*使字符類[[:blank:]]可選(零個或多個),所有字符由以前\(.*\)

+0

感謝您解釋它,現在它變得更有意義,但我仍然對'[^ [:blank:]]'是如何運作的感到困惑。我的意思是,它是如何知道這裏會有一個角色,謝謝'空白'? – user3014381

+0

@ user3014381:它什麼都不知道!您強制正則表達式引擎查找非空白字符。 –

+0

我想我明白'。*'是因爲貪婪的力量在右邊最遠的地方尋找那個角色。我認爲。我可能錯了。我很可能是。 – user3014381

0

問題吃不符合[[:blank:]]*.*。由於*是貪婪的,它也匹配尾隨空格。

我寧願使用[[:space:]]到位[[:blank:]]

[:blank:] [ \t]   space and TAB characters only 
[:space:] [ \t\n\r\f\v] blank (whitespace) characters 

嘗試以下sed的。

echo "TITLE= B=ack=To ian " | sed -rn -e 's/^[^=]*=//' -e 's/^[[:space:]]*|[[:space:]]*$//gp' | od -tx1 -tc 

輸出:

0000000 42 3d 61 63 6b 3d 54 6f 20 69 61 6e 0a 
      B = a c k = T o  i a n \n 

思想這裏是在兩個步驟中

  1. 刪除字符串執行替換直到幷包括第一=即第一=

    後保留整個字符串
  2. 裝飾領先和尾隨空格。