我有一个包含3列的文件,我想将第二个词拉出来并将其附加到该行的末尾。我怎样才能做到这一点?我用宏来尝试它,但它一直告诉我,例如
E492: Not an editor command: 0whyt $p
有什么想法吗?
答案 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 '$0=$0 FS $2'
答案 1 :(得分:1)
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