
假設我有一個包含以下內容的文件:
這是一個_檔_,其中有一些_特殊_關鍵字,我希望_替換它們。
我可以搜尋特殊關鍵字並將其替換為“%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')/