用控制台命令生成的输出替换 vim 中的正则表达式,并将表达式作为其参数?

tma*_*ric 7 linux vim find-and-replace

假设我有一个包含以下内容的文件:

这是一个_file_,其中包含一些_special_ 关键字,我会_like_ 替换它们。

我可以使用“%s/_*_/something”进行搜索和替换特殊关键字,但我希望“something”成为外部命令的输出。这在 vim 中是可能的,还是我需要 awk 它?

Ing*_*kat 10

是的你可以。见:help sub-replace-special;将\=允许您使用Vim表达式替换。并且system()可以执行外部命令并返回其输出。请参阅我的简单示例hostname。请注意,我必须使用substitute()来摆脱输出中的尾随换行符。

:%s/_[^_]*_/\=substitute(system('hostname'),'\n','','g')/g
Run Code Online (Sandbox Code Playgroud)

PS:我还更正了您的正则表达式模式以匹配您的示例。


小智 5

在对我帮助很大的 Ingos 回答中,我没有看到如何引用匹配的子模式并将其用作 shell 命令的参数(“由控制台命令生成,并将表达式作为其参数”)。

在我的情况下,我有以下形式的日志行:[<unix timestamp>] <message>, 即[1406844000] foobar. 我想以人类可读的形式在它们前面加上时间。

以下 vim 命令匹配时间戳(子匹配 1)和消息(其余的,子匹配 2)并在 date 命令之前添加时间字符串:

:% s/^\[\(\d\+\)\] \(.*\)$/\=substitute(system('date -d @'.submatch(1)),'\n', '', 'g').': ['.submatch(1).'] '.submatch(2)/
Run Code Online (Sandbox Code Playgroud)

[1406844000] foobar得到Fr 1. Aug 00:00:00 CEST 2014: [1406844000] foobar

HTH