我有一个像这样的字符串"thisissometext"
:我想在给定目录中(递归地)找到包含此字符串的所有文本文件,或者它的任何变体,中间有空格和/或换行符。例如,包含"this is sometext"
, 或"this\n issometext"
,的文本文件"this\n isso metext"
应该出现在搜索中。我怎样才能做到这一点?
我有一个像这样的字符串"thisissometext"
:我想在给定目录中(递归地)找到包含此字符串的所有文本文件,或者它的任何变体,中间有空格和/或换行符。例如,包含"this is sometext"
, 或"this\n issometext"
,的文本文件"this\n isso metext"
应该出现在搜索中。我怎样才能做到这一点?
使用较新版本的 GNU
grep
(具有-z
选项),您可以使用这个衬里:考虑到空格只能出现在单词之间。
如果你只是想从当前目录开始递归搜索所有文件,你不需要
find
,你可以使用grep -r
(递归)。find
可用于选择性地搜索要搜索的文件,例如选择要排除的目录的文件。所以,简单地说:这里的主要技巧是
-z
,它将处理输入流中以 ASCII NUL 结尾的每一行而不是新行,因此我们可以使用常规方法匹配换行符。[[:space:]]
字符类模式表示任何空白字符,包括空格、制表符、CR、LF 等。因此,我们可以使用它来匹配所有可以出现在单词之间的空白字符。grep -l
将只打印具有任何所需模式的文件名。如果您还想打印匹配项,请使用-H
instead of-l
。另一方面,如果空格可以出现在任何地方而不是单词,这将失去它的美观:
使用
-P
(PCRE) 选项,您可以替换为[[:space:]]
(\s
这看起来会好得多):使用@steeldriver 的建议来
sed
为我们生成模式将是最好的选择:您可以删除所有空格并对其进行 grep:
扩展:
命令,
bash
扩展:这将遍历所有参数并使用上述测试。
下面的代码递归地在目录中搜索文件,删除所有出现的
" "
和"\n"
。如果该字符串存在于剩余文本中,则存在匹配项。这意味着空格/换行符可以位于文件中字符串的任何位置。它能做什么
如果它找到匹配的文件,它们将在终端中打印出来,包括它们的路径,例如:
我内置的 try / except 是为了防止脚本在遇到不可读文件时中断。
剧本
如何使用
find_string.py
使用目录和字符串作为参数运行它:
如果字符串或目录包含空格,请使用引号:
笔记
该脚本按原样查找包含字符串的文件,其中包含空格或换行符。它可以用行中的其他字符/字符串(例如制表符)扩展:
您可以使用
grep -i --recursive 'word1\|word2' *
并且awk '/word1/,/word2/'
可以用来处理换行符