题
我正在尝试在 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