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

前任:“xxxxx xxxxx 24:00:00 CDT”

尝试过

s:24:00:00 CDT::g

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

s:/:::g

如有任何帮助,我们将不胜感激。

有帮助吗?

解决方案

通常,VI使用下面的命令信作为分隔符的字符。

尝试这种情况:

s!24:00:00 CDT!!g

其他提示

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

AWK / VI / perl的/红宝石(还有更多),让您指定要wahtever分隔符。这个字符是以下的命令字符的一个(在我们的情况下为S),例如:

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

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

sMhel/loMthereM

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

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

s[hello]

s(hello)

我觉得对于搜索和替换的风格,你可以使用s[hello][there]甚至可能是s[hello](there)。但是关于这个括号最后一句话是,当我使用ALST perl的半想起猜测。

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

:s/://g

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

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

我可能会尝试: -

%s/\d\{2}:\d{2}:\d{2}//g
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top