2009-09-18 39 views
2

我正在尝试在VI中进行查找和替换以删除时间戳。我通常在VI中使用S命令执行此操作,但是如何告诉VI我需要在VI命令的部分结构中删除冒号使用VI去除冒号

EX:“xxxxx xxxxx 24:00:00 CDT”

试图

s:24:00:00 CDT::g

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

s:/:::g

任何援助表示赞赏。

+2

请编辑标题以更好地匹配问题。你说你想删除时间戳,而不仅仅是冒号。 – 2009-09-18 17:00:05

+4

不,问题是他想删除多个冒号。这是一个时间戳并不重要。重要的是他没有意识到冒号不是一个固定的分隔符。 – Pod 2009-09-18 17:05:21

+0

你是对的Pod。直到现在,冒号都是我用过的。谢谢。 – homerjay 2009-09-18 17:10:10

回答

3

通常情况下,vi使用命令字母后面的字符作为分隔符。如果你想确保它

xxxxx xxxxx 

试试这个:

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

除非每行都有相同的时间戳,这不是很有用。 – 2009-09-18 16:59:05

+1

是真实的,但它足以解决这个特殊的问题 – homerjay 2009-09-18 17:10:46

2

在我的vi版本中,我可以执行以下操作来从一行中删除冒号。因人而异。

:s/://g 
+0

打败我吧。 我正在使用GVim,它的工作原理。不知道vi在* nix上。 – 2009-09-18 16:53:41

+0

该问题实际上是要求删除时间戳,而不是单个冒号。 – 2009-09-18 16:56:14

+2

我从这个问题中了解到冒号是问题,而且OP知道如何处理其余的问题。此外,问题的标题是'使用VI删除冒号'。所以,这是对这个极简主义的解释。 :) – 2009-09-18 17:17:50

2

s/\d\+:\d\+:\d\+ CDT//g作品对我来说:

初始内容

命令后
xxxxx xxxxx 24:00:00 CDT 

将只影响时间戳(如,该正则表达式以上变化的任何数量的数字> 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

这里的问题是不匹配一个冒号,但你已经被教导VIM必须使用冒号来单独它的正则表达式。这是不正确的。

awk/vi/perl/ruby​​(还有更多)让你指定你想要的wahtever分隔符。这个字符是以下命令字符(在我们的情况下,S)的一个,如:

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

都是相同的正则表达式,只是用不同的分隔符。这flexability的意思是,如果你经常使用/,但是你需要匹配一个/在正则表达式,那么你可以切换到其他一些分隔符,如:

sMhel/loMthereM 

虽然“M”可能不是最好的当正则表达式包含文本时选择 - 这取决于你的风格和你真正匹配的东西。

你甚至可以使用括号。对于一个正则表达式是:

s[hello] 

s(hello) 

我认为对于搜索和替换的风格,你可以使用s[hello][there],甚至可能s[hello](there)。但是最后一句关于括号的语句是从我使用perl的时候开始记住的一个猜测。