如何在vi或vim编辑器中删除特定字符

如何在vi或vim编辑器中删除特定字符,vim,Vim,我在vi中有一些txt: |NC_004718|29751nt|SARS |NC_045512|29903nt|Severe |NC_004718|29751nt|SARS |NC_045512|29903nt|Severe |NC_004718|29751nt|SARS 现在我想替换NC_004718之后的所有内容,我的预期输出是: NC_004718 NC_045512 NC_004718 NC_045512 NC_004718 怎么做?谢谢。例如 :g/NC_\d\+/normal!

我在vi中有一些txt:

|NC_004718|29751nt|SARS
|NC_045512|29903nt|Severe
|NC_004718|29751nt|SARS
|NC_045512|29903nt|Severe
|NC_004718|29751nt|SARS
现在我想替换NC_004718之后的所有内容,我的预期输出是:

NC_004718
NC_045512
NC_004718
NC_045512
NC_004718
怎么做?谢谢。

例如

:g/NC_\d\+/normal! ygnV]p
  • :g/regex/
    匹配行
  • 正常以执行正常模式命令
  • ygn
    拖动先前由
    匹配的文本:g
  • V
    选择整行
  • ]p
    p
    用匹配项替换行

我建议使用带正则表达式的替换来匹配整个字符串,并捕获希望保留在括号中的内容。这样,您就可以用匹配项替换整个字符串

:%s/^|\([^|]\+\)|.\+/\1/
要分解正在发生的事情:

  • %
    表示要将命令应用于文件中的每一行
  • s
    表示您正在执行替换命令(每行)。
    s
    命令的语法为
    s//
  • 上述命令中的常规ERESION模式是
    ^|\([^ |]\+\)\.\+
    • ^
      表示从行开始匹配
    • |
      匹配字符
      |
    • \([^ |]\+\)
      匹配除字符
      \
      之外的所有字符。请注意,真正的正则表达式实际上是
      ([^ |]+)
      ,附加的
      \
      字符在这里,因为Vim需要知道它们是用于处理的特殊字符,而不是它需要匹配的精确字符。还请注意,括号用于将匹配项捕获到一个组中(请参见下文)
    • |
      再次匹配实际字符
      |
    • \+
      匹配所有字符,直到行尾。请注意,默认情况下,
      被视为特殊字符,但
      +
      仍需要前面的
      \
  • 替换文本仅为
    \1
    。这表示Vim应该用第一组中捕获的内容(即第一组括号)替换文本
  • 此命令没有标志,因此在最后一个
    /
    之后没有任何内容

  • 如果您只有显示的行,请尝试:

     :%norm xf|D
    

    我用示例文本对此进行了测试,它删除了所有文本。