我有一個像這樣的字串:"thisissometext"
。我想(遞歸地)找到給定目錄中包含此字串的所有文字文件,或其中間帶有空格和/或換行符的任何變體。例如,包含"this is sometext"
, 或"this\n issometext"
,的文字檔案"this\n isso metext"
應顯示在搜尋中。我怎樣才能做到這一點?
答案1
對於較新版本的 GNU grep
(有該-z
選項),您可以使用這一行:
find . -type f -exec grep -lz 'this[[:space:]]*is[[:space:]]*some[[:space:]]*text' {} +
考慮到空格只能出現在單字之間。
如果您只想從目前目錄開始遞歸搜尋所有文件,則不需要find
,只需使用grep -r
(recursive).find
可用於選擇性地搜尋文件,例如選擇要排除的目錄中的文件。所以,簡單來說:
grep -rlz 'this[[:space:]]*is[[:space:]]*some[[:space:]]*text' .
這裡的主要技巧是
-z
,它會處理輸入流中以 ASCII NUL 結尾的每一行而不是換行符,因此我們可以使用通常的方法來匹配換行符。[[:space:]]
字符類模式表示任何空白字符,包括空格、製表符、CR、LF 等。grep -l
將僅列印具有任何所需模式的檔案名稱。如果您還想列印匹配項,請使用-H
代替-l
。
另一方面,如果空白可以出現在任何地方而不是單字,這就會失去它的美觀:
grep -rlz
't[[:space:]]*h[[:space:]]*i[[:space:]]*s[[:space:]]*i[[:space:]]*\
s[[:space:]]*s[[:space:]]*o[[:space:]]*m[[:space:]]*e[[:space:]]*\
t[[:space:]]*e[[:space:]]*x[[:space:]]*t' .
使用-P
(PCRE) 選項,您可以將其替換[[:space:]]
為\s
(這看起來更好):
grep -rlzP 't\s*h\s*i\s*s\s*i\s*s\s*s\s*o\s*m\s*e\s*\
t\s*e\s*x\s*t' .
使用@steeldriver的建議為sed
我們產生模式將是最好的選擇:
grep -rlzP "$(sed 's/./\\s*&/2g' <<< "thisissometext")" .
答案2
您可以刪除所有空格並 grep 它:
tr -d '[[:space:]]' < foo | grep thisissometext
擴展:
find . -type f -exec bash -c 'for i; do tr -d "[[:space:]]" < "$i" | grep -q thisissometext && printf "%s\n" "$i"; done' _ {} +
該bash
命令擴展為:
for i
do
tr -d "[[:space:]]" < "$i" |
grep -q thisissometext &&
printf "%s\n" "$i"
done
這將循環所有參數並使用上述測試。
答案3
下面的程式碼遞歸地搜尋目錄中的文件,刪除所有出現的" "
和"\n"
。如果該字串存在於剩餘文字中,則存在符合。這意味著空格/換行符可以在任何文件中字串的位置。
它能做什麼
如果找到匹配的文件,它們將在終端中列印,包括它們的路徑,例如:
/home/jacob/Bureaublad/testmap/test2.txt
/home/jacob/Bureaublad/testmap/Naamloze map 2/test1.txt
我內建的 try / except 是為了防止腳本在遇到不可讀的檔案時中斷。
劇本
#!/usr/bin/env python3
import os
import sys
s = sys.argv[2]
for root, dirs, files in os.walk(sys.argv[1]):
for file in files:
file = root+"/"+file
try:
if s in open(file).read().replace(" ", "").replace("\n",""):
print(file)
except:
pass
如何使用
- 將腳本複製到一個空文件中,另存為
find_string.py
使用目錄和字串作為參數來運行它:
python3 /path/to/find_string.py <directory> <string_to_find>
如果字串或目錄包含空格,請使用引號:
python3 /path/to/find_string.py '<directory>' '<string_to_find>'
筆記
該腳本會尋找包含字串的文件,其中包含空格或換行符。它可以用行中的其他字元/字串(例如製表符)進行擴展:
if s in open(file).read().replace(" ", "").replace("\n",""):
答案4
您可以使用grep -i --recursive 'word1\|word2' *
andawk '/word1/,/word2/'
可用於處理換行符