Мне нужно преобразовать «12.22.54» в «12:22:54» в строке ниже, чтобы она работала в MS SQL.
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 для обратных ссылок. Perl, конечно, никогда не будет стандартизирован, пока Ларри Уолл рядом.
Согласно комментарию, автор хотел изменить все строки. В 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
, в то время какнви(наиболее соответствующий стандарту из четырех) — нет.