使用VI去除结肠

时间:2009-09-18 16:47:55

标签: regex vi delimiter

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

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

尝试

s:24:00:00 CDT::g

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

s:/:::g

感谢任何帮助。

5 个答案:

答案 0 :(得分:6)

这里的问题与冒号不匹配,但是你已经被告知vim必须使用冒号分隔它的正则表达式。这是不正确的。

awk / vi / perl / ruby​​(以及更多)允许您指定所需的wahtever分隔符。该字符是命令字符后面的字符(在我们的例子中是S),例如:

s/hello/there/
s:hello:there:
s@hello@there@

都是相同的正则表达式,只是使用不同的分隔符。这种灵活性意味着如果你经常使用/,但是你需要匹配正则表达式中的/,那么你可以切换到其他一些分隔符,例如:

sMhel/loMthereM

虽然当正则表达式包含文本时“M”可能不是最佳选择 - 但这取决于你的风格以及你真正匹配的内容。

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

s[hello]

s(hello)

我认为对于搜索和替换样式,您可以使用s[hello][there]甚至s[hello](there)。但关于方括号的最后一句是从我使用perl时的一半记忆猜测。

答案 1 :(得分:3)

通常,vi使用命令字母后面的字符作为分隔符。试试这个:

s!24:00:00 CDT!!g

答案 2 :(得分:2)

在我的vi版本中,我可以执行以下操作从一行中删除冒号。 YMMV。

:s/://g

答案 3 :(得分: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

其中最终g改变了所有出现的模式,而不仅仅是第一个模式。

如果列表中有多个时区,请将它们分组:

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

答案 4 :(得分:1)

它不是命令的一部分,因为它应该让你使用你喜欢的任何分隔符。

我可能会尝试: -

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