私のディレクトリにはたくさんのファイルセットがあります。これらのファイルには任意のテキストが含まれています。
その特定のファイルのテキスト内でファイル名を検索したいと思います。明確にするためにfile1.py.txt
(はい、2つの点.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)
./
ファイルのリストは語彙順にソートされます。で始まる名前は.
無視されます(一部のシェルにはdotglob
再度追加するオプションがあります。を使用すると、glob修飾子をzsh
使用することもできます)。(D)
答え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