2014-01-08 100 views
0

我想只選擇一行中的匹配字符串。 這是我的測試字符串:在KornShell中選擇兩個單詞之間的字符串

  • 「我正在使用基本的grep表達式。」

我想要從「am」開始並以「express」結尾的字符串。但是在上面提到的那一行中,我的結尾詞不在那裏,而不是那個「表達」在那裏。 我爲此使用了以下命令。 echo 'I am using basic grep expression.' | sed -n "s/.*\(am.*express\).*/\1/p"

但它給這個樣子,

  • 「現在用grep的基本表達」

理想情況下,不應該放棄任何輸出按我的要求。任何人都可以爲此提出解決方案嗎?

回答

0

您需要字錨添加到您的正則表達式:

grep -o '\<am\>.*\<express\>' <<END 
I am using basic grep expression. 
END 

該命令不產生輸出。

僅當左邊的字符是「單詞字符」(字母,數字,下劃線)並且右邊的字符是「非單詞字符」時,零長度定位符\>纔會匹配。爲\<

參考類似http://man.cx/regexp(5)


如果你沒有GNU的grep,perl的將工作做好

perl -lne 'print $1 while /(\bam\b.*?\bexpress\b)/g' <<END 
I am using basic grep expression. 
but here I am in the express lane at the grocery store and am further on express time. 
not here 
END 
am in the express 
am further on express 
+0

文件的最後一行快遞尤其是測試Hi..I想你的代碼如下..但它無法正常工作。你可以考慮一下嗎? – user3173463

+0

回聲「我正在使用基本的grep表達式」| grep'\ 。* \ ' – user3173463

+0

在HP UNIX中,grep -o不存在。所以請爲此建議一個替代方案。 – user3173463

0
echo 'I am using basic grep expression.' | sed ... 

取決於你的意思是:

  • 全線開始amexpress

    sed的-n 「/^am.*express$/ P」

  • 包含am結束,後來與express

    隨後的sed - n「/am.*express/p」

on the number line(2 Max在這種情況下)

sed -n "/^am/ { 
    /am.*express$/ {p;b} 
: more 
    N 
    /am.*express$/ {p;b} 
    s/.*\n// 
    /am/ b more 
    }" 

要對3個以上的線

+0

謝謝......但是我的問題是,'express'這個詞在下一行。你可以建議這是一個解決方案。 – user3173463

相關問題