將 vim 中的正規表示式替換為控制台命令產生的輸出,並將表達式作為其參數?

將 vim 中的正規表示式替換為控制台命令產生的輸出,並將表達式作為其參數?

假設我有一個包含以下內容的文件:

這是一個_檔_,其中有一些_特殊_關鍵字,我希望_替換它們。

我可以搜尋特殊關鍵字並將其替換為“%s/_*_/something”,但我希望“something”成為外部命令的輸出。這在 vim 中可能嗎,或者我需要 awk 嗎?

答案1

是的你可以。看:help sub-replace-special;允許\=您用 Vim 表達式替換。並且system()可以執行外部命令並返回其輸出。請參閱我的簡單範例hostname。請注意,我必須使用它substitute()來刪除輸出中的尾隨換行符。

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

PS:我還更正了您的正規表示式模式以符合您的範例。

答案2

在 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)/

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

華泰

答案3

對於 ldiff 檔案中的 Base64 替換:

:%s/:: \(.*\)$/\=substitute(': ' . system('echo '.submatch(1).'|base64 -d'),'\n','','g')/

相關內容