2016-03-30 54 views
0

我想在bash腳本中使用grep從文件中獲取只包含單詞「version」的行,問題在於我想要的文件中的更多行腳本在那裏看到另一個單詞「dlversion」。grep需要匹配一個特定的單詞

我管道grep的成剪切命令,輸出將被保存爲一個變量

的問題是,它要麼沒有保存到變量或它節省了線,我已經嘗試過幾種方法我發現,儘管他們都沒有工作。

grep -Fx version /path/to/file.txt | cut -c9- 

輸出=沒什麼

grep '^version$' /path/to/file.txt | cut -c9- 

輸出=沒什麼

grep "version" /path/to/file.txt | cut -c9- 

輸出=兩條線

還試圖

grep -w "version " /path/to/file.txt | cut -c9- 

輸出=無

我也嘗試使用-F,-x在他們自己也導致變量沒有價值。

+0

似乎使用邊界可能會幫助你:「\ bversion \ b」。 – Dominique

+0

謝謝你,我改變了'cut'從第一個字符開始,然後使用'-v'過濾掉第一個'grep'的輸出,並通過第二個''過濾掉剩餘的字母並且它工作。 –

回答

1

你有幾個選項,取決於你的grep版本。

如果支持,最好的選擇是使用單詞邊界\b你的單詞的兩端:

grep '\bversion\b' /path/to/file.txt 

或者:

grep '\<version\>' /path/to/file.txt 

\<\>比賽在開始的空字符串和分別結尾。

否則,您可以創建自己的一套,你認爲不是一個字的字符:

grep -E '(^|[[:space:][:punct:]])version' /path/to/file.txt 

這個「版本」相匹配,通過該行的開始或任何類型的空間或之前標點。

在特定情況下,你可以使用這樣的事情:

grep -E '(^|[^l])version' /path/to/file.txt 

這個「版本」,由該行的開始或不是一個「L」以外的任何之前匹配。

在回答您的評論:

  • ^行的開頭匹配。
  • |表示「或」。
  • [^l]是括號表達式,其中^作爲第一個字符的意思是「不」(所以這匹配除「l」以外的每個字符)。
  • 圓括號用於創建一個組,因此「或」僅適用於該模式的這一部分。
+0

謝謝!我正在使用的grep版本不支持邊界。你建議的答案雖然工作。既然我很好奇,想要理解後來可能會使用的東西,你能否解釋一下'^ |'和'[^ l]'究竟做了什麼? –

+0

我更新了答案以解釋每個部分。 –

+0

非常感謝。 –

1

在情況下,任何複雜的技巧失敗,使用蠻力:管的結果通過另一grep過程中過濾掉不需要的話線(用於該-v選項):

grep 'version' sourcefile | grep -v 'dlversion' > destination 
+0

暴力強制完美運作。謝謝。 –