我有下面的示例文件
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
命令将这些选项卡转换为换行符(与上面的技巧相同)。