Vim - yank第二行,并多次附加到行尾

时间:2014-09-05 15:31:13

标签: vim vi

我有一个包含3列的文件,我想将第二个词拉出来并将其附加到该行的末尾。我怎样才能做到这一点?我用宏来尝试它,但它一直告诉我,例如 E492: Not an editor command: 0whyt $p

有什么想法吗?

5 个答案:

答案 0 :(得分:4)

我猜你被“宏录音”和“命令”搞糊涂了。你可能已经做过:

:0whyt $p<Enter>

这不正确。您应该按q

在正常模式下录制宏

假设光标位于第1行,第1行。

qqelye$p+q

然后xx@q

或使用递归宏:qqelye$p+@qq然后@q

qq  "start recording in reg q
e   "to the end of 1st col
lye "yank the 2nd col with leading col separator
$p  "append to the EOL
+   "go to next line

:正常

在这种情况下,

:normal非常方便:

:%normal! elye$p

如果计算外部awk也是如此:

AWK

:%!awk '$0=$0 FS $2'

答案 1 :(得分:1)

AWK

awk '{print $0, $2}' foo.txt

或者来自Vim内部:

:%!awk '{print $0, $2}'

答案 2 :(得分:0)

这个正则表达式替换将会这样做:

s/\(\S\+\)\(\s\+\S\+\)\(.*\)/\1\3\2/

您可以通过在命令前加上范围边界来在范围上执行它。您可以通过g命令在匹配某些正则表达式的所有行上执行它。

答案 3 :(得分:0)

看起来您想使用普通命令。

:%normal 0whyt $p

将在文件的每一行上运行0whyt $p

答案 4 :(得分:0)

使用AWK的另一种解决方案:

:%!awk {'print $1,$2,$3,$2'}

(但彼得更好)

另一个:normal解决方案:

:%norm f yE$p

另一个:s//解决方案:

:%s/\v(\S*) (\S*) (\S*)/& \2