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
| 归档时间: |
|
| 查看次数: |
2102 次 |
| 最近记录: |