对grep返回的文件执行命令

时间:2016-03-18 23:42:05

标签: bash vim grep find

假设我想使用vim一个接一个地编辑目录中的每个.html文件,我可以这样做: find . -name "*.html" -exec vim {} \;

但是,如果我只想一个接一个地编辑包含某个字符串的每个html文件呢?我使用grep来查找包含这些字符串的文件,但是如何将每个字符串传递给vim,类似于find命令。 Perphaps我应该使用grep以外的东西,或以某种方式将find命令传递给grep然后exec vim。有没有人知道如何一个接一个地编辑包含某个字符串的文件,与上面给出的find命令示例相同?

3 个答案:

答案 0 :(得分:3)

grep -l 'certain string' *.html | xargs vim

这假设您没有包含空格等的偏心文件名。如果必须处理偏心文件名,请检查grep是否有-z选项来终止具有空字节的输出行(并且xargs具有-0选项以进行读取这样的输入),如果是,那么:

grep -zl 'certain string' *.html | xargs -0 vim

如果您需要搜索子目录,可能您的Bash版本支持**

grep -zl 'certain string' **/*.html | xargs -0 vim

注意:这些命令在批量文件上运行vim。如果您必须为每个文件运行一次,那么在提及-n 1之前,您需要使用xargs作为vim的额外选项。如果你有GNU xargs,当你的输入中没有文件名时,可以使用-r阻止它运行vimgrep扫描的文件都不包含'某些字符串')。

当您发明混淆事物的新方法时,可以继续进行变化。

答案 1 :(得分:0)

使用find

find . -type f -name '*.html' -exec bash -c 'grep -q "yourtext" "${1}" && vim "${1}"' _ {} \;

在每个文件上,调用使用yourtext grep文件的bash命令,如果文本匹配则使用vim打开它。

答案 2 :(得分:0)

解决方案 for 周期:

for i in $(find . -type f -name '*.html'); do vim $i; done

关闭之前的内容后,应该会在单独的 vim 会话中打开所有文件。