2016-07-24 51 views
2

我有一個主文件,我將其用作查找,並且我有搜索字符串是短語。當它是一個變量時對一個短語進行清理

我現在的嘗試是

for i in `cat list`    #list contains the phrases that I'm looking for 
do 
grep $i master.file 
done 

但是自從我最初的搜索項目(在這種情況下$ I)是一個短語,我得到了很多的錯配。例如,如果短語是「Blah for the」,那麼我會得到很多匹配,其中有「the」或「for」,但不是完整的模式。從命令行我可以做

grep "Blah for the" master.file 

它給了我有意義的結果。 如何從腳本中獲得相同的結果?

一個可能的解決方案是將我的短語和我的主文件中的空格分開。但那會變得很難看。

任何幫助表示讚賞。 謝謝!

+2

只需使用'grep的-f列表master.file' – anubhava

+0

@anubhava謝謝,這似乎是我一直在尋找的答案。但是,當我嘗試這個時,結果的順序變得混亂。即如果在「列表」中有10個短語,我用你的線得到的答案給我匹配錯誤的順序。任何想法,爲什麼這可能是? – VM17

+1

切勿使用未加引號的變量(除非您可以在您知道自己在做什麼的情況下下注美元賬單;這就是變量語法中的$)。 ' 「$ I」'。當然'''貓'什麼都不會在這裏工作。在循環中使用'read'。 –

回答

2

有幾種可能性。如果我正確地理解了這一點,那麼你想循環遍歷行而不是文件中的單詞。這裏指出了兩種可能的方式: https://unix.stackexchange.com/questions/7011/how-to-loop-over-the-lines-of-a-file

您可以使用IFS=$'\n'將換行符作爲唯一的分隔符,否則使用相同的代碼。這是指出了鏈接的答案,以及另一種可能是使用read

while IFS= read -r i; do 
    grep "$i" master.file 
done < list 
+0

這工作。 grep中的無引號變量對我來說是個問題。謝謝! – VM17

+0

產生你期望的輸出的腳本給出了一些特定的輸入是找到答案的起點,而不是終點。與http://stackoverflow.com/a/38553616/1745001相比,這將非常慢。另請參見[爲什麼要使用shell循環處理文本被認爲是壞行爲](http://unix.stackexchange.com/questions/169716/why-is-using-a-外殼環到過程文本視爲壞實踐)。 –

3

grep-f選項讀取新行從文件中分離的圖案:

grep -f list master.file 

還要注意的是,如果你想搜索固定字符串,而不是正則表達式的模式,你還需要-F選項:

grep -Ff list master.file 
+0

這是運營商尋找的另一種方式嗎? :) – sjsam

+1

@EdMorton對,編輯..感謝 – heemayl

相關問題