3

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

例如:“ xxxxx xxxxx 24:00:00 CDT”

试过了

s:24:00:00 CDT::g

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

s:/:::g

任何帮助表示赞赏。

4

5 回答 5

7

这里的问题不是匹配冒号,而是你被教导 vim 必须使用冒号来分隔它的正则表达式。这是不正确的。

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

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

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

sMhel/loMthereM

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

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

s[hello]

或者

s(hello)

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

于 2009-09-18T17:04:26.967 回答
3

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

试试这个:

s!24:00:00 CDT!!g
于 2009-09-18T16:51:54.207 回答
2

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

:s/://g
于 2009-09-18T16:50:58.423 回答
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
于 2009-09-18T16:52:21.470 回答
1

它实际上不是命令的一部分,因为它应该允许您使用任何您喜欢的分隔符。

我可能会尝试:-

%s/\d\{2}:\d{2}:\d{2}//g
于 2009-09-18T16:53:14.650 回答