2016-09-12 26 views
2

我需要搜索大量的數據文件。我想查找包含字符串「foo \ tbar \ tboo」的文件。我曾經嘗試這樣做...如何grep for「string tstring」?

$ find . -name "foo*dat" -exec grep foo {} \; | less 
      "miscinfo_foo" => [ 
           "foo\tbar\tnot_foo" 
             "miscinfo_foo", 
      "miscinfo_foo" => [ 
           "foo\tbar\tyes_foo" 
             "miscinfo_foo", 

但如果我這樣做......

$ find . -name "foo*dat" -exec grep -E "foo\tbar" {} \; 

...我沒有得到任何輸出。我也嘗試過egrep。我試圖用\\t逃脫\t,但仍然沒有輸出。

我在做什麼錯?

感謝

+3

嘗試''富\\ tbar''或'其他的變化',而不是' ''「'。我認爲你正在尋找的'\ t'是字面文本,而不是一個轉義序列,所以你需要保護字面反斜槓免受bash處理。 – cxw

+0

謝謝cxw。這樣可行! –

回答

2

嘗試

find . -name "foo*dat" -exec grep -E 'foo\\tbar' {} \; 
            ^^ ^
在單引號

而非雙,並有額外的反斜槓。 ''阻止bash處理反斜槓,因此grep實際上會看到foo\\tbar。根據您的輸出,我認爲您正在尋找文字反斜槓字符,而不是ASCII字符9,所以請將反斜槓加倍以使grep與文本字符匹配。

+0

'-E'沒有什麼用處。 –

1

有在這裏打球兩個方面的影響:

  1. grep的理解\t意味着製表符。
  2. shell將在雙引號字符串內將\\擴展爲\

你想斜槓進行轉義,所以你需要通過\\t單引號內的grep:

grep 'foo\\tbar'