
次のような内容のファイルがあるとします。
これは、置き換えたい _特別な_ キーワードがいくつか含まれている _ファイル_ です。
特定のキーワードを「%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')/