我正在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是一个很棒的命令行工具,它混合了
grep
,find
和完整的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/。