我正在尝试在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
感谢任何帮助。
答案 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