【问题标题】:Remove colon using VI使用 VI 删除冒号
【发布时间】:2010-11-29 13:30:06
【问题描述】:

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

感谢任何帮助。

【问题讨论】:

  • 请编辑标题以更好地匹配问题。您说要删除时间戳,而不仅仅是冒号。
  • 不,问题是他要删除多个冒号。它是时间戳的事实并不重要。重要的是他没有意识到冒号不是固定的分隔符。
  • 你是正确的 Pod。到目前为止,我只使用了冒号。谢谢。
  • 感谢大家的回复。
  • @Pod,@homerjay:问题是“我正在尝试在 VI 中进行查找和替换以删除时间戳”。要么标题错了,要么问题错了。

标签: regex vi delimiter


【解决方案1】:

这里的问题不是匹配冒号,而是你被教导 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 时的一个半记忆猜测。

【讨论】:

    【解决方案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
    

    【讨论】:

      【解决方案3】:

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

      我可能会尝试:-

      %s/\d\{2}:\d{2}:\d{2}//g
      

      【讨论】:

        【解决方案4】:

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

        试试这个:

        s!24:00:00 CDT!!g
        

        【讨论】:

        • 除非每一行都有相同的时间戳,否则这不是很有用。
        【解决方案5】:

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

        :s/://g
        

        【讨论】:

        • 打败我。我正在使用 GVim,它可以工作。不确定 *nix 上的 vi。
        • 问题实际上要求删除时间戳,而不是单个冒号。
        • 我认为冒号是问题所在,并且 OP 知道如何处理其余部分。问题的标题也是“使用VI删除冒号”。所以,这是对它的极简解释。 :)
        猜你喜欢
        • 2012-08-12
        • 1970-01-01
        • 2019-12-05
        • 2012-08-31
        • 2017-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多