![查找某个单词在子文件夹中的出现情况](https://linux22.com/image/217256/%E6%9F%A5%E6%89%BE%E6%9F%90%E4%B8%AA%E5%8D%95%E8%AF%8D%E5%9C%A8%E5%AD%90%E6%96%87%E4%BB%B6%E5%A4%B9%E4%B8%AD%E7%9A%84%E5%87%BA%E7%8E%B0%E6%83%85%E5%86%B5.png)
您好,我正在尝试查找子文件夹中所有出现的单词。虽然这似乎很容易,但我希望对于每次出现的情况,我们都将显示路径和文件名,后跟“-> Line:”,然后是包含该出现的行号。
例如 : example/example/file.png -> Line: 25
我尝试这样做:grep -rnl 'word' subfolder/ | sed 's/$/ -> Line : /'
但我找不到在末尾打印该行的方法这是我使用此命令得到的结果的示例:(example/example/file.png -> Line:
)
在此先感谢您的帮助
答案1
在grep -rnl 'word' subfolder/
,-n
与 冲突-l
。您必须决定是否只需要文件名 ( -l
) 还是将所有匹配项与行号 ( ) 一起打印-n
。
因此,假设您指的是后者,grep -rn pattern folder/
会打印如下内容:
folder/file:4:line with pattern
folder/file:with:colon:12:other pattern line
folder/subfolder:with:colon/file
with
newline:12:pattern again
很明显,没有办法从中提取行号。
仅当您可以保证文件路径不包含:
也不包含换行符时才能完成此操作。也许有类似的东西:
grep -rn pattern folder/ |
LC_ALL=C sed 's/^\([^:]*\):\([^:]*\)\(.*\)/\1\3 -> Line: \2/'
为了可靠地完成此操作,无论文件路径可能包含什么字符或非字符,您需要:
find folder/ -type f -exec awk '
/pattern/ {
print FILENAME":"$0" -> Line: "FNR
}' {} +
这也消除了对非标准和不可移植-r
选项的需要grep
。
1 尽管如果目录层次结构太深以至于文件路径长度超过PATH_MAX
,则可能不太可靠。