如何在 Vim 中删除第二列?

如何在 Vim 中删除第二列?

我有一个制表符分隔的文件,例如:

name1   verb1   name2   verb2   etc...

我想删除第二列。我尝试编辑其中一列这些答案,但由于不熟悉sedawk,所以我无法做到。

谁能帮我?

答案1

接受的答案比这更优雅(我赞成它!)但如果你不记得了,你可以使用vim 视觉块模式直接。打开 vim 并进入(正常模式)列的第一个角,如下所示:

在此处输入图片描述

输入CTRL-V后您就可以移动光标来选择列,这是中间:

在此处输入图片描述

要到达最后,请按G

在此处输入图片描述

该块似乎被破坏了,因为我们在最后一行是空白的;只需向上移动一行(使用向上箭头或k)即可再次看到它……:

在此处输入图片描述

现在您只需按下x即可删除该块:

在此处输入图片描述

答案2

在 vim 中,你应该能够使用命令

:%s/\t[^\t]*//

(替换TAB后跟零个或多个任何字符,但TAB不包括任何内容)。如果你的文件只有两列,你可以使用稍微简单一点的:%s/\t.*:%s/\t.*$替换第一列TAB任何跟随字符直到行尾。

答案3

我会用cut这个

cut -f1,3- file.txt > newfile.txt
mv newfile.txt file.txt

您也可以将其用作 vim 中的过滤器(这将替换文件中的所有行;您也可以使用(例如)2,9而不是%来处理第 2-9 行,或者使用 选择您想要的行V):

:%!cut -f1,3-

-f1,3-表示“打印字段一,然后打印字段三,以及所有字段,直到行尾”。默认情况下,cut使用制表符作为分隔符;如果您需要其他分隔符,请使用选项-d(请参阅man cut)。

答案4

要删除从左侧 83 个字符开始到第 94 个字符的列,您可以尝试此操作(移动光标,直到到达要删除的列的两侧,然后使用 Control-G 查看光标的位置):

:%s/\(^.\{83}\).\{11}/\1/

简而言之:匹配每行的前 83 个字符,记住匹配的内容,现在匹配接下来的 11 个字符,并用前匹配的 83 个字符替换整整 94 个字符。

http://www.peterscheie.com/unix/vi_del_columns.html

更详细地说,整个过程如下:按下 Esc 键,然后按下冒号,以进入冒号提示符。现在我们说,“在每一行%,我们将进行搜索和替换s,这是我们要查找的正则表达式/。记住下一部分\(:从行首开始^,匹配任何字符.,执行 83 次\{83},这就是记忆的结束\)。现在匹配任何字符.,执行 11 次\{11}。现在我已经告诉您要查找什么,接下来我们将用什么来替换它/。用我要求您记住的第一件事来替换我们匹配的内容\1。最后,这就是我们的搜索和替换的结束/

但要注意,他在文章中提到“colrm”,好像它是 vim 的一部分,但事实并非如此。它是一个 shell 转义,而我的 Windows 机器上没有 colrm :-)。

相关内容