如何使用 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
有很多方法可以做到这一点,以下是其中的一些:
:%s/\%>56c.//g
:%s/\%57c.*//
:%s/\v^.{56}\zs.*//
:% normal 57|D
(这个假设virtualedit=all
或virtualedit=onemore
)- Shift-g
57
|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/ .*//