假设我在文本文件中有以下样式的行:
"12" "34" "some text "
"56" "78" "some more text"
.
.
.
etc.
我希望能够删除前两列的引号。使用Vim(我目前正在使用gVim)的最佳方法是什么?
我想出如何使用可视模式至少删除每行的开头引号,然后输入命令'<,'>s!^"!!
我想知道是否有办法选择整个文本列(一个字符直接沿着文件...或者超过1,但在这种情况下我只想要一个)。如果可能,那么您是否可以将 x 命令(删除字符)应用于整个列。
可能有更好的方法来做到这一点。我正在寻找任何建议。
Just和FYI,我提出了一些建议。我的_vimrc
文件现在包含以下行:
let @q=':%s/"\([0-9]*\)"/\1/g^M'
(注意:^M
CTRL Q + 输入以模拟运行命令后按Enter键<) / p>
现在我可以通过 @ q 使用宏来删除文件中两个数字列的所有引号。
答案 0 :(得分:28)
使用视觉块命令:
了解更多信息 :h visual-mode
答案 1 :(得分:18)
Control-V用于块选择。这样你就可以选择同一个字符列中的内容了。
好像你想删除数字周围的引号。为此,
:%s/"\([0-9]*\)"/\1/g
这是list of what patterns you can do with vim。
还有一种(丑陋的)形式,每行限制为4次替换。
:%s/^\( *\)"\([ 0-9]*\)"\([ 0-9]*\)"\([ 0-9]*\)"/\1\2\3\4/g
而且,如果你有sed
方便,你也可以在shell中尝试这些。
head -4 filename.txt | sed 's/pattern/replacement/g'
将在文件的前4行尝试命令。
答案 2 :(得分:4)
假设您要删除除第一个列之外的所有列,简单易行的方法是在Vim中输入:
:%!awk '{print $1}'
或者您想要除第一个列之外的所有列,您也可以这样做:
:%!awk '{$1="";$0=$0;$1=$1;print}'
确实需要外部工具来完成任务,但默认情况下awk安装在Linux和Mac中,我认为没有类UNIX系统经验的人很少在Windows中使用Vim,否则你可能知道如何获得Windows awk的版本。
答案 3 :(得分:3)
见column editing in vim。它描述了列插入,但基本上它应该以相同的方式进行删除。
答案 4 :(得分:3)
虽然这个案例很容易用正则表达式修复,但如果你想做一些更高级的东西,我还建议录制像Bryan Ward这样的宏。另外,对于我来说,宏比记住在vim的正则表达式中需要转义哪些字符更容易。宏是很好的,因为你可以看到你的变化立即发生,并一次以较小的位进行线变换。
所以在你的情况下你会按qw开始在寄存器w中录制一个宏(你当然可以使用你想要的任何字母)。我通常使用^来启动我的宏以移动到行的开头,因此宏不依赖于光标的位置。然后你可以做一个f“跳到第一个”,x来删除它,f“跳到下一个”,x也删除它。然后q完成录制。
而不是让你的宏结束在下一行我实际上已经迟到今天发现你可以只是V(视觉线选择)你想要应用你的宏并执行所有行:normal @w将你的宏应用于将W注册到每个可视选择的行。
答案 5 :(得分:1)
您还可以创建一个删除引号的宏(q),然后下拉到下一行。然后你可以通过告诉vi执行它多少次来运行它。因此,如果您存储宏来表示字母m,那么您可以运行100 @ m,它将删除100行的引号。有关宏的更多信息:
答案 6 :(得分:1)
其他解决方案都很好。你也可以试试......
:1,$s/^"\(\w\+\)"/\1/gc
有关更多Vim正则表达式帮助,请参阅http://vim.wikia.com/wiki/Search_patterns。
答案 7 :(得分:1)
键入::s/\%V"//g
,这将导致以下命令:
:'<,'>s/\%V"//g
按 Enter ,这将删除所选块中的所有"
次出现。
请参阅:Vim Wikia的Applying substitutes to a visual block