我的目录中有一大组文件。这些文件包含任意文本。
我想搜索该特定文件文本中的文件名。为了澄清,我有file1.py.txt
(是的,两个点.py.txt
)并且file2.py.txt
都包含文本。我想搜索@code prefix.file1.py
里面的字符串是否存在以及里面的file1.py.txt
字符串@code prefix.file2.py
file2.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}
替换FILENAME
为substr(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