VI での検索と置換

VI での検索と置換

MS SQL で動作するように、以下の文字列の「12.22.54」を「12:22:54」に変換する必要があります。

cast('14-JAN-14 06.65.22 AM' as datetime),'63.124.79.253');
cast('14-JAN-14 12.22.36 AM' as datetime),'63.124.79.253');
cast('14-JAN-14 22.13.54 AM' as datetime),'63.124.79.253');

viでファイルを開いて次のように置き換えてみました

:s/(\d\{2\})\.(\d\{2\}z)\.(\d\{2\})/$1:$2:$3/g

しかし、うまくいきません。助けてください。

答え1

IP アドレスを回避するには、一致する文字列の前後にスペースを入れます。

:%s/ \(\d\d\)\.\(\d\d\)\.\(\d\d\) / \1:\2:\3 /g

答え2

viPerlスタイルの正規表現は使用しません。

:s/(\d\{2\})\.(\d\{2\}z)\.(\d\{2\})/$1:$2:$3/g

しかし、vi次のような構文を使用します(vimとvileは受け入れます\dが、「ヴィ」):

:s/\([[:digit:]]\{2\}\)\.\([[:digit:]]\{2\}\)\.\([[:digit:]]\{2\}\)/\1:\2:\3/g

(「z」はどこから来たのでしょうか?)。

重要なのは、Perl が「非推奨」と呼んでいるのは、バック参照の POSIX 構文だということです。もちろん、Larry Wall がいる限り、Perl が標準化されることはありません。

コメントによると、OP の意図はすべての行を変更することでした。vi では、特別な範囲を使用してそれを実行します%

:%s/\([[:digit:]]\{2\}\)\.\([[:digit:]]\{2\}\)\.\([[:digit:]]\{2\}\)/\1:\2:\3/g

範囲を明示的に使用することもできます($POSIXも):

:1,$s/\([[:digit:]]\{2\}\)\.\([[:digit:]]\{2\}\)\.\([[:digit:]]\{2\}\)/\1:\2:\3/g

IP アドレスを避けるために境界を構築する方法は他にもあります。ただし、示されている例では、空白で十分です。

:s/ \([[:digit:]]\{2\}\)\.\([[:digit:]]\{2\}\)\.\([[:digit:]]\{2\}\) / \1:\2:\3 /g

同じく、ヴィムそして下劣なはスペースとして を受け入れます\sが、POSIX はリテラルスペース (示されているように) または文字クラス のみを受け入れます[:space:]。ほとんどの人は[spacetab]よりも と入力する方が問題が少ないと感じます[[:space:]]

前述のように、「vi」と答えると、他の人は標準(POSIX)の動作に基づいて答えるかもしれません。「vi」の代わりに使用できるいくつかのエディタは、正規表現構文の拡張機能を提供します。簡単に確認すると、エルヴィスはPerlスタイルの と もサポートしています\d\sネヴィ(4 つの中で最も標準に準拠している) はそうではありません。

関連情報