Мне нужно преобразовать '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

Но это не работает. Пожалуйста помоги.

2 ответа2

1

vi не используются регулярные выражения в стиле perl. Вы написали

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

но vi использует такой синтаксис (vim и vile accept \d , но вы сказали "vi"):

: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

Аналогично, vim и vile принимают \s для пробелов, но POSIX принимает только буквальный пробел (как показано) или класс символов [:space:] . Большинство людей считают , набрав [ушко] меньше проблем , чем [[:space:]]

Как уже отмечалось, если вы говорите "vi", другие могут выбрать ответ на основе стандартного (POSIX) поведения. Некоторые редакторы, которые можно использовать вместо "vi", предоставляют расширения синтаксиса регулярных выражений. Быстрая проверка показывает, что elvis также поддерживает Perl-стиль \d и \s , в то время как nvi (наиболее совместимый со стандартами из четырех) - нет.

0

Чтобы избежать IP-адреса, я просто ставлю пробелы вокруг соответствующей строки:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .