我有下面的示例文件

d41d8cd98f00b204e9800998ecf8427e  /home/abid/Testing/FileNamesTest/apersand $ file
d41d8cd98f00b204e9800998ecf8427e  /home/abid/Testing/FileNamesTest/file[with square brackets]
d41d8cd98f00b204e9800998ecf8427e  /home/abid/Testing/FileNamesTest/~$tempfile
017a3635ccb76250b2036d6aea330c80  /home/abid/Testing/FileNamesTest/FileThree
217a3635ccb76250b2036d6aea330c80  /home/abid/Testing/FileNamesTest/FileThreeDays
d41d8cd98f00b204e9800998ecf8427e  /home/abid/Testing/FileNamesTest/single quote's

我想把文件的最后一部分(文件名)改成grep,但我要找与行的最后一部分(文件名)完全匹配的文件
grep FileThree$ files.md5
017a3635ccb76250b2036d6aea330c80  /home/abid/Testing/FileNamesTest/FileThree

返回一个完全匹配的文件,但找不到“file3days”,这是我所追求的,但由于某些文件名包含方括号,我不得不使用grep-F或fgrep。但是,像上面这样使用fgrep是行不通的,它不会返回任何内容。
我如何使用fgrep精确匹配行的最后一部分,同时还遵守上面的特殊字符~/$/'/[]等…或使用awk的任何其他方法。。。
进一步。。。。
使用fgrep返回这两个文件时,我只想要一个完全匹配的文件(使用grep返回上面的$),但是使用fgrep返回的$不会返回任何内容。
 grep -F FileThree files.md5
017a3635ccb76250b2036d6aea330c80  /home/abid/Testing/FileNamesTest/FileThree
217a3635ccb76250b2036d6aea330c80  /home/abid/Testing/FileNamesTest/FileThreeDays

最佳答案

我无法从你的问题中分辨出所有细节,但听起来你可以使用grep,只需转义特殊字符:grep 'File\[Three\]Days$'
不过,如果您想使用fgrep,可以使用一些tr技巧来帮助您。如果只需要文件名(不需要目录名),可以执行以下操作

cat files.md5 | tr '/' '\n' | fgrep FileThreeDays

这个tr命令用换行符替换斜杠,因此它将把每个文件名放在自己的行上。这意味着fgrep只会在搜索file3d时找到文件名。
如果您想要完整的文件名和目录,它有点棘手,但类似的方法将工作。假设SHA和文件名之间始终有一个双空格,并且没有任何文件名中包含双空格或制表符,则可以尝试以下操作:
sed 's/  /\t' files.md5 | tr '\t' '\n' | fgrep FileThreeDays

这个sed命令将双空格转换为制表符。tr命令将这些选项卡转换为换行符(与上面的技巧相同)。

08-26 21:10