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
vi
Perlスタイルの正規表現は使用しません。
: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 つの中で最も標準に準拠している) はそうではありません。