使用grep(在一个shellscript中)每个匹配只显示一个文件

时间:2015-12-18 02:32:21

标签: bash shell grep

如何将grep的输出限制为每个文件只有一行?

(因为这是一个shellcript函数的一部分,我可以使用所有东西,但是我太苛刻了,无法弄清楚如何以正确的方式管道特定部分。)

我正在尝试编写的函数基本上是“给定一个字符串,显示每个文件(在此目录和所有子目录中),其中包含它并显示这些文件的列表作为可点击链接”

(顺便说一下。你能不能给我提示脚本/命令,这样做的是什么?)

如果您有兴趣:.bashrc中的函数是: (并且应该像:“foobar”)

function where(){
    grep -rHoiIm1 "$@" | cut -d":" -f1-1 | asURL
}

function asURL() {
    PREFIX="file://$(pwd)/";
    sed "s*^*$PREFIX*" |
    sed 's/ /%20/g'; 
}

2 个答案:

答案 0 :(得分:3)

如果您只对匹配文件的路径感兴趣,请使用-l / --files-with-matches选项:

function where(){
  grep -riIl "$@" | asURL
}

请注意,在您使用-l后,我已经省略了几个不再适用的选项。

顺便说一句:虽然您的asUrl()功能在简单的情况下可以正常工作,但它并不完全健壮,并且可能导致无效的网址。除此之外,两个调用sed没有理由;只需将两个s调用串在一个脚本中,并以;分隔。

答案 1 :(得分:2)

-l选项添加到grep,告诉它仅输出文件名。

来自grep man page

  

-l <​​/ P>      

- 文件与 - 匹配

     

抑制正常输出;而是打印每个输入文件的名称   通常会打印哪个输出。扫描每个文件   第一场比赛停止。 (-l由POSIX指定。)