如何使用 Vim 剪切文本文件

如何使用 Vim 剪切文本文件

如何使用 vim 剪切文本文件?例如,我想将文件剪切到位置 56。所以我想保留位置 1-56 中的所有内容,并删除从位置 57(包括 57)到每一行行尾的所有内容。

文本文件:

Web Application - http://sharepoint

Url                                                     CompatibilityLevel
---                                                     ------------------
http://sharepoint                                       15
http://sharepoint/sites/appcatalog                      15
http://sharepoint/sites/devtest                         15
http://sharepoint/sites/publishing                      15

我可以使用 awk 或多或少得到我想要的结果:

$awk '{print $1}' file

结果:

Web

Url
---
http://sharepoint
http://sharepoint/sites/appcatalog
http://sharepoint/sites/devtest
http://sharepoint/sites/publishing

但说我想吹毛求疵,真的想保住冠军头衔。我如何使用 vim 从技术上将此文件剪切到位置 56。最好是在 vim 中。意思是我在 vim 中打开了该文件。

答案1

有很多方法可以做到这一点,以下是其中的一些:

  1. :%s/\%>56c.//g
  2. :%s/\%57c.*//
  3. :%s/\v^.{56}\zs.*//
  4. :% normal 57|D(这个假设virtualedit=allvirtualedit=onemore
  5. Shift-g57|Ctrl-v1Shift-gEndx(这个假设virtualedit=all

编辑:根据要求添加手册中的相关反流:

  • 对于 1. 和 2. ( :h /\%c):

    \%23c 匹配特定列。
    \%<23c 匹配特定列之前。
    \%>23c 匹配特定列之后。
    这三个可用于匹配缓冲区或字符串中的特定列。 “23”可以是任何列号。第一列是 1。实际上,该列是字节数(因此对于多字节字符来说并不完全正确)。

  • 对于 3.( :h \zs):

    \zs 在任意位置匹配,并在那里设置匹配的开始:下一个字符是整个匹配的第一个字符。

  • 对于 4.( :h |, :h D, :h :normal, :h :%, :h 'virtualedit'):

    | 筛选当前行中的第 [count] 列。独家动议。塞西不是烟斗

    ["x]D 删除光标下的字符直至行尾,并再删除 [count]-1 行 [进入寄存器 x]; “d$”的同义词。

    :norm[al][!] {commands}执行普通模式命令{commands}。这使得执行在命令行上键入的正常模式命令成为可能。 {commands} 像键入一样执行。

    % 等于1,$(整个文件)

    'virtualedit' 这些单词的逗号分隔列表:
    block 允许在可视块模式下进行虚拟编辑。
    insert 允许在插入模式下进行虚拟编辑。
    all 允许在所有模式下进行虚拟编辑。
    onemore 允许光标移过行尾

    虚拟编辑意味着光标可以定位在没有实际字符的地方。这可以位于选项卡的中间或超出行尾。对于在可视模式下选择矩形和编辑表格很有用。

  • 对于 5.( :h G, :h CTRL-V, :h <End>, :h x):

    G 转到第 [count] 行,默认为最后一行,按行查找第一个非空白字符。

    [count]CTRL-V 逐块启动可视模式。

    $<End>到行尾。

    ["x]x删除光标下方和之后的 [count] 个字符 [到寄存器 x](不是逐行)。与“dl”相同。

答案2

假设“位置”指的是“列”,可以使用正则表达式

:%s/^\v(.{56}).*/\1/

这表示从该行的开头开始^更像 Perl(\v魔术)匹配任何内容.56 次,保存该内容(括号),.*以匹配该行的其余部分;将行替换为\1或 括号中保存的内容。

你也可以或多或少地调用awk,除非过滤器由于某种原因是非法的:

:%!awk '{print $1}'

答案3

在 vim 中,为了{print $1}获得除标题之外的所有内容,请尝试:

:2,$s/ .*// 

相关内容