搜索包含文件名的字符串

搜索包含文件名的字符串

我的目录中有一大组文件。这些文件包含任意文本。

我想搜索该特定文件文本中的文件名。为了澄清,我有file1.py.txt(是的,两个点.py.txt)并且file2.py.txt都包含文本。我想搜索@code prefix.file1.py里面的字符串是否存在以及里面的file1.py.txt字符串@code prefix.file2.pyfile2.py.txt

如何进行自定义grep,使其遍历目录中的每个文件,使用该特定文件名搜索每个文件中的字符串?

编辑:

我正在寻找的输出写在一个单独的文件中,result.txt其中包含:文件名(如果找到匹配项)、行文本(找到匹配项的位置)

答案1

使用 GNU awk

gawk '
  BEGINFILE{search = "@code prefix." substr(FILENAME, 3, length(FILENAME) - 6)}
  index($0, search)' ./*.py.txt

将报告匹配的行。

要打印文件名和匹配行,请更改index($0, search)

  index($0, search) {print FILENAME": "$0}

或者仅打印文件名:

  index($0, search) {print FILENAME; nextfile}

替换FILENAMEsubstr(FILENAME, 3)可跳过输出前缀./

文件列表按词法排序。名称以 开头的.将被忽略(某些 shell 可以dotglob选择将它们添加回来;使用zsh,您还可以使用(D)glob 限定符)。

答案2

需要 grep 找到的每个文件。

-l指示仅当找到grep文件名时才打印文件名。regex

如果文件名不包含任何/字符,请尝试以下操作:

find a_directory -type f -name \*.py.txt -exec sh -c '
  for fname; do
    basename="${fname##*/}"
    grep -lF "@code prefix.${basename%.*}" "${fname}"
  done' sh {} +

请参阅man bash以下项目:

  • "${fname##*/}"file1.py.txt,如果fname==a_directory/file1.py.txt
  • "${basename%.*}"file1.py,如果basename==file1.py.txt

相关内容