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

私に大いに役立った Ingo の回答では、一致のサブパターンを参照して、それをシェル コマンドの引数として使用する方法がわかりません (「式を引数としてコンソール コマンドによって生成される」)。

私の場合、次の形式のログ行がありました: [<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

HTH

答え3

ldiff ファイルでの base64 置換の場合:

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

関連情報