2013-10-31 30 views
3

我有不同的場景。爲了更清楚地說明這是我想要的。使用grep搜索匹配的字符串,但搜索應只顯示沒有匹配的字的字符串的其餘部分

我已經與以下信息名爲myfile文件:

Saurav Kumar 
    Sumeet Kumar 
Punit Kumar Sharma 
     Supreet Prasad Sinha 
    N. Senthil Kumar 
A. Salai Nayagan 
. 
. 

等等。現在如果我想獲得具有Kumar作爲一部分的名字,我可以簡單地使用:

grep -i "kumar" myfile 

那麼它將返回是這樣的:

Saurav Kumar 
    Sumeet Kumar 
Punit Kumar Sharma 
    N. Senthil Kumar 

我想要的不是在搜索結果中顯示Kumar這個詞。 I,E的搜索結果,而Kumar這樣的:

Saurav 
    Sumeet 
Punit Sharma 
    N. Senthil 

還有一兩件事我必須只使用grep來得到的結果沒有任何別的東西一樣trsedawk等。

我不知道我的問題標題是否合適。所以我請求改變它使它更有意義。

我會很樂意得到解決方案。

在此先感謝!

+0

您可以使用負向lookbehind來匹配所需的部分,但使用'grep'則無法獲得所需格式的_output_。 – devnull

回答

2

我能來稍微接近導致額外新行

grep -P -o -i '.*(?=kumar)|(?<=kumar).*' file | grep -v '^\s*$' 

輸出

Saurav 
    Sumeet 
Punit 
Sharma 
    N. Senthil 
+0

謝謝!你幾乎可以解決問題。如果我有一條額外的線路,這並不重要。我檢查了它只在匹配詞在兩者之間時發生。 –

+0

@SauravKumar很高興它爲你工作。你給了一個非常好的挑戰! – jkshah

2

使用grep無法實現您正在尋找的內容。

您可以使用negative lookbehind比賽使用grep文本的期望部分,但我不認爲你可以得到所需形式的輸出。例如,他說:

grep -P '\w+\b(?<!\bKumar)' yourinput 

會導致:

**Saurav** Kumar 
    **Sumeet** Kumar 
**Punit** Kumar **Sharma** 
     **Supreet Prasad Sinha** 

星號**周圍的文字表示的匹配的單詞。

但是,如果你試圖只打印匹配的話,那不會是真的在同一條線上:

$ grep -oP '\w+\b(?<!\bKumar)' yourinput 
Saurav 
Sumeet 
Punit 
Sharma 
Supreet 
Prasad 
Sinha 

使用負前瞻,你可以說:

grep -P '(?!Kumar\b)\b\w+' input 
+0

這就是問題所在。我所提到的場景與實際問題相比並無任何可比性。無論如何,我必須使用'grep',因爲我正在使用'--line-buffered'選項。雖然我會嘗試你的答案。希望它能起作用!\ –

+0

既然你提到'--line-buffered',你有沒有探究'stdbuf'? – devnull

+0

它只是'grep'命令的一部分,我是我想要的,它正在使用'--line-buffered'。但另一個答案看起來更加具體和正確。我非常感謝你的努力。 :) –

相關問題