2009-09-18 4 views
2

Я пытаюсь найти и заменить в VI, чтобы удалить отметку времени. Я обычно делаю это в VI с помощью команды S, но как я могу сказать VI Мне нужно удалить двоеточие, когда его часть структуры команды VI самогоУдалить двоеточие, используя VI

EX: «ххххх ххххх 24:00:00 CDT»

пытался

s:24:00:00 CDT::g

s:"24:00:00 CDT"::g

s:/:::g

Любой помощь приветствуется.

+2

Пожалуйста, отредактируйте название, чтобы лучше совместить вопрос. Вы говорите, что хотите удалить временную метку, а не только двоеточие. –

+4

Нет, проблема в том, что он хочет удалить несколько двоеточий. Тот факт, что это временная метка, не имеет значения. Важно то, что он не понимает, что толстая кишка не является разделителем. – Pod

+0

Вы правы Под. До сих пор двоеточие было всем, что я использовал. Спасибо. – homerjay

ответ

3

Обычно vi использует символ, который следует за буквой команды как разделитель.

Попробуйте это:

s!24:00:00 CDT!!g 
+1

, если каждая строка не имеет такую ​​же метку времени, это не очень полезно. –

+1

true, но этого было достаточно, чтобы решить эту конкретную проблему – homerjay

2

В моей версии vi я могу сделать следующее, чтобы удалить двоеточия из строки. YMMV.

:s/://g 
+0

Побей меня. Я использую GVim, и он работает. Не уверен о vi на * nix. –

+0

Вопрос на самом деле требует удаления метки времени, а не одного двоеточия. –

+2

Я взял вопрос о том, что толстая кишка является проблемой и что ОП знал, как справиться с остальными. Также заголовок вопроса - «удалить двоеточие, используя VI». Итак, это минималистская интерпретация этого. :) –

2

s/\d\+:\d\+:\d\+ CDT//g работает для меня:

исходное содержание:

xxxxx xxxxx 24:00:00 CDT 

после команды:

xxxxx xxxxx 

, если вы хотите быть уверены, что будем влияют только на метки времени (как в том, что регулярное выражение выше изменяет любое количество цифр> 1), использовать

s/\d\d:\d\d:\d\d CDT//g 

где конечный г меняет все вхождения шаблона, а не только первый.

Если у вас есть более чем один часовой пояс в списке, группировать их:

:s/\d\+:\d\+:\d\+^Y \(CDT\|UDT\)//g 
1

Это не является частью команды, так как она должна позволить вам использовать любой разделитель вам нравится.

Я бы, наверное, попробовать: -

%s/\d\{2}:\d{2}:\d{2}//g 
6

Проблема здесь не соответствия двоеточие, но что вы учили, что ВИМ должны использовать двоеточие для того чтобы отделить это регулярное выражение. Это неверно.

awk/vi/perl/ruby ​​(и многие другие) позволяют указать разделитель wahtever, который вы хотите. Этот символ является один после командного характера (в нашем случае S), например:

s/hello/there/ 
s:hello:there: 
[email protected]@[email protected] 

все же регулярное выражение, просто с разными разделителями.Это flexability означает, что если вы часто используете /, но затем вы должны соответствовать в/в регулярном выражении, то вы можете просто переключиться на какой-либо другой разделитель, например:

sMhel/loMthereM 

Хотя «М» не может быть лучшим если регулярное выражение содержит текст - это зависит от вашего стиля и того, что вы действительно соответствуете.

Вы даже можете использовать скобки. Для одного регулярного выражения это:

s[hello] 

или

s(hello) 

Я думаю, что для поиска и замены стиля вы можете использовать s[hello][there] или, возможно, даже s[hello](there). Но последнее предложение о скобках - это наполовину запоминающееся предположение, когда я использовал perl.