尋找包含給定文字的文字文件,忽略新行和空格?

尋找包含給定文字的文字文件,忽略新行和空格?

我有一個像這樣的字串:"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

如何使用

  1. 將腳本複製到一個空文件中,另存為find_string.py
  2. 使用目錄和字串作為參數來運行它:

    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/'可用於處理換行符

在此輸入影像描述

相關內容