我正在尝试在 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
任何帮助表示赞赏。
这里的问题不是匹配冒号,而是你被教导 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 时的一个半记忆猜测。
通常,vi 使用命令字母后面的字符作为分隔符。
试试这个:
s!24:00:00 CDT!!g
在我的 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