Vi Regex - 列编辑

时间:2012-11-04 10:19:11

标签: regex vi delimiter

我在vi-editor中打开了一个包含9列的文本,我想用逗号替换第9列(最后一列)中的制表符,后跟空格。到目前为止,我想出了这个;

'2,$s#\(^.\{8\}\)\\t#\1\(\,\)#'

但是这似乎与任何东西都没有匹配......可能是我逃避了太多东西,但我也不知道你是否需要指定列分隔符(在这种情况下也是一个标签)。 对此的任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

%s/^\(\%(\t\?[^\t]\+\)\{8\}\)\t\(.*\)$/\1, \2/

这取代了(s):

  • ^ - 行的开头
  • \( (第1组)的开头
    • \%(内部小组的开始
      • \t? 0或更多 Tab s(以说明在行首时缺少 Tab
      • [^\t]\+后面跟着1个非 Tab
    • \)内部小组结束
    • \{8\}上述内部群体重复了8次
  • \) (第1组)
  • 结尾
  • \t后跟 Tab
  • \(.*\)以及其他(第2组)
  • $直到行尾

使用:

  • \1 - (第1组)(一直到第8天标签
  • - 逗号和空格
  • \2 - (第2组)(从第8个标签到行尾的所有内容)

在整个缓冲区(%)。

答案 1 :(得分:0)

如果这是一次性替换,您可以使用宏(从您希望更改的第一行的第一个字符开始):

q q ˚F 标签 7 ; C 空间 ESC Ĵ < KBD> 0 q

按键如下:

  • q q - 开始在寄存器中记录宏 q
  • f Tab - 找到第一个制表符(即第1列和第2列之间)
  • 7 ; - 重复此次查找七次(即第8列和第9列之间的制表符)
  • c l Space Esc - 将Tab字符更改为a逗号和空格
  • j - 走一行
  • 0 - 转到此行的开头
  • q - 停止录制宏

然后使用 @ q 播放下一行(或 9 9 @ q 播放下一行99行等。)