对 grep 返回的文件执行命令

OB7*_*DEV 1 vim bash grep find

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

但是,如果我只想一个接一个地编辑包含某个字符串的每个 html 文件怎么办?我使用 grep 来查找包含这些字符串的文件,但是如何将每个文件通过管道传输到类似于 find 命令的 vim。Perphaps 我应该使用 grep 以外的东西,或者以某种方式将 find 命令通过管道传递给 grep 然后执行 vim。有谁知道如何一个接一个地编辑包含某个字符串的文件,就像find我上面给出的命令示例一样?

Jon*_*ler 5

grep -l 'certain string' *.html | xargs vim
Run Code Online (Sandbox Code Playgroud)

这假设您没有带有空格等的古怪文件名。如果你要处理古怪的文件名,请检查您是否grep有一个-z选项,以终止与空字节输出线(和xargs有一个-0选项来读取这些输入),如果是这样的话:

grep -zl 'certain string' *.html | xargs -0 vim
Run Code Online (Sandbox Code Playgroud)

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

grep -zl 'certain string' **/*.html | xargs -0 vim
Run Code Online (Sandbox Code Playgroud)

注意:这些命令vim在批处理文件上运行。如果你必须按照文件一次运行它,那么你需要使用-n 1的额外选项,xargs你提到之前vim。如果您有 GNU xargs,您可以使用-r它来阻止它vim在其输入中没有文件名时运行(扫描的文件都不grep包含“特定字符串”)。

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