我正在Vim中使用Ack插件,它可以帮助我快速搜索项目中的字符串。但是,有时我想替换所有或部分出现的找到的字符串。您可以像这样(source)使用Vim arglist进行某种全局搜索和替换。
:

:args app/views/*/*
:argdo %s/, :expire.*)/)/ge | update

但是,我不想使用args,而是希望通过Ack进行搜索,然后对找到的所有文件进行替换。有什么方法可以类似于argdo命令吗?

最佳答案

我决定使用ack和Perl在Vim之外解决此问题,因此我可以使用功能更强大的Perl正则表达式代替GNU子集。您可以将此映射到vimrc中的按键。

ack -l 'pattern' | xargs perl -pi -E 's/pattern/replacement/g'

说明

确认

ack是一个很棒的命令行工具,它混合了grepfind和完整的Perl正则表达式(不仅仅是GNU子集)。它使用纯Perl编写,速度快,具有突出显示的匹配项,可在Windows上运行,并且与传统命令行工具相比对程序员更友好。使用sudo apt-get install ack-grep将其安装在Ubuntu上。

xargs

Xargs是旧的UNIX命令行工具。它从标准输入读取项目并执行指定的命令,然后执行为标准输入读取的项目。因此,基本上,由ack生成的文件列表将附加到perl -pi -E 's/pattern/replacemnt/g'命令的末尾。

perl -pi

Perl是一种编程语言。 -p选项使Perl在您的程序周围创建一个循环,该循环遍历文件名参数。 -i选项使Perl在适当位置编辑文件。您可以修改它以创建备份。 -E选项使Perl执行指定为程序的一行代码。在我们的例子中,该程序只是Perl regex的替代品。有关Perl命令行选项 perldoc perlrun 的更多信息。有关Perl的更多信息,请参见http://www.perl.org/

09-13 06:10
查看更多