2013-07-02 44 views
1

我有一個包含這些行的文件:如何獲得egrep的匹配^爲每一行(因爲它應該是)

SOME COMMAND 34 XXXXX ; 
; a comment which may contain a : 
     sometext001 : X00 : 1 ; 
        : X01 : 1 ; 
        : X11 : 1 ; 

而且要檢索sometext001使用grep/egrep的。

使用正則表達式^\s*[^:\s;]+\s*:

(在詞:起始於與一些或沒有空白的行的開頭,接着在至少一個字符不是空格,結腸癌或分號再次其次是一些或沒有空格,隨後冒號)

如果啓用多線支持,我可以使用在線正則表達式測試儀http://regexr.com?35eam來匹配文本(包括以下內容:)。

我的印象是,grep/egrep無論如何都是一行一行地工作,那麼爲什麼在包含這個例子的文件中使用egrep時,正則表達式不起作用?

是否有另一種方法來實現egrep所需的結果,或者,如果這不可能,還有另一個可從shell腳本調用的單線程?

更新:雖然指定了線的正則表達式來^[[:space:]]*[^[:space:];]+[[:space:]]*:所提出的變化相匹配,則它仍然使用-o選項egrep命令時,該行相匹配兩次,一次爲sometext001 :和一次X00 :爲明顯。 如何解決這個問題?

更新:測試文件完全包含上面給出的文本。命令行是egrep -o '^([[:space:]]*[^:[:space:];]+[[:space:]]*:)' test.txt(也嘗試沒有()對)。輸出是

 sometext001 : 
X00 :   
+0

你是對的,grep works li一行一行。你不能在多行上使用grep(正如你在這裏試圖做的那樣) – KingJohnno

+1

@KingJohnno你能解釋一下我的正則表達式中的多行嗎?我只是想匹配一行文本中的字符。沒有花哨的先行或後視,沒有明確的換行符等。 –

+0

我想知道你的代碼,你張貼 - 我相信':'表示新行。對不起,有任何困惑。 – KingJohnno

回答

2

egrep使用POSIX EREs默認情況下,那些不承認\s和其他Perl樣式的簡寫。嘗試

^[[:space:]]*[^:[:space:];]+[[:space:]]*: 
+0

「不承認」似乎並不完全正確。我可以單獨搜索'\ s'並且會得到有效的結果(至少沒有任何結果與\字面上相匹配) –

+0

但解決了我的問題。謝謝! –

+0

雖然它解決了我的問題,但我再次刪除了「正確答案」標記。我仍然認爲這與egrep處理換行符的方式有關,並且這個問題沒有得到解答。 –

1

你應該更好地利用-P(如正則表達式開關perl的)與你有正則表達式:

grep -P '^\s*[^:\s;]+\s*:' 
+0

'-P'在我的grep版本中似乎不是一個有效的選項(GNU grep 2.5.1) –

0

與GNU的grep:

grep -Po '^\s*\K[^\s:;]*(?= :)' 

與yourexample:

kent$ echo "SOME COMMAND 34 XXXXX ; 
; a comment which may contain a : 
     sometext001 : X00 : 1 ; 
        : X00 : 1 ; 
        : X11 : 1 ;"|grep -Po '^\s*\K[^\s:;]*(?= :)' 
sometext001 
+0

-P在我的grep版本中似乎不是一個有效的選項(GNU grep 2.5.1) –