假设我想使用vim一个接一个地编辑目录中的每个.html文件,我可以这样做:
find . -name "*.html" -exec vim {} \;
但是,如果我只想一个接一个地编辑包含某个字符串的每个html文件呢?我使用grep来查找包含这些字符串的文件,但是如何将每个字符串传递给vim,类似于find命令。 Perphaps我应该使用grep以外的东西,或以某种方式将find命令传递给grep然后exec vim。有没有人知道如何一个接一个地编辑包含某个字符串的文件,与上面给出的find
命令示例相同?
答案 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
阻止它运行vim
(grep
扫描的文件都不包含'某些字符串')。
当您发明混淆事物的新方法时,可以继续进行变化。
答案 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 会话中打开所有文件。