我正在编辑CNC Gcode文本文件,需要一种方法来引用文件和刀具路径中的位置。我想修改文本文件中的每一行,使其以大写N字符开头,后跟行号,每行连续几十行,然后是空格,后跟原始文本文件。我可以在vi中这样做吗?
答案 0 :(得分:2)
我不确定vi,但是(因为你正在使用vim标签)Vim允许你完成如下任务:
手动调整第一行(在行的开头插入N10
),然后将光标放在下一行的开头。
按qb
开始录制宏(用于存储宏的寄存器的b
名称;可以随意使用其他字母 - 并且明确执行如果你在b
中藏匿了一些有用的东西,请使用不同的字母。
将光标向上移动到上一行的开头(您已手动调整)。按v
开始视觉选择模式,然后按f
将光标移动到该行的下一个空格(如果您使用单个空格作为空白分隔符,那么;如果您',请调整此步骤重新使用标签或多个空格。)
按y
以抽取所选文字。这也将删除视觉选择。
将光标移动到下一行的开头。按P
在光标前面插入先前被拉动的文本,即在行的最开头。
将光标移动到行标题的数字部分。按10 C-a
(1,0,控制+ A)将该数字增加10。
将光标移动到下一行的开头。按q
停止录制宏。
按10000000 @b
执行宏10000000次或直到它到达文件末尾。这应该足以照顾文件中的所有行,除非非常大,在这种情况下使用更大的数字。
...或者使用Vim编写一个简单的脚本,以您最喜欢的语言完成工作,然后从终端运行(或者使用像:!./your-script-name
这样的Vim。 ; - )
答案 1 :(得分:0)
有两种可能的方法可以在不使用外部工具的情况下执行此操作:宏或Vim脚本。在我看来,第一种方式有点麻烦(可能没有下面列出的解决方案那么有效)。
第二种方式可以像这样实现(将代码放入.vimrc
或以其他方式获取):
function! NumberLines(format) range
let lfmt = (empty(a:format) ? 'N%04d' : a:format[0]) . ' %s'
for lnum in range(a:firstline, a:lastline)
call setline(lnum, printf(lfmt, lnum, getline(lnum)))
endfor
endfunction
command! -range=% -nargs=? NumberLines <line1>,<line2>call NumberLines([<f-args>])
NumberLines
函数枚举给定范围内文件的所有行,并根据给定的printf格式(默认为'N%04d')在每行前面加上其编号。为了简化这个函数的使用,我在这里创建了一个新命令,它接受要处理的行的范围(默认情况下,整个文件)和行号的可选参数格式。
答案 2 :(得分:0)
作弊回答:
:%!awk '{print "N" NR "0", $0}'
答案 3 :(得分:0)
以下命令将添加'N&lt; 行号* 10 &gt;'每一行。
:g/^/exe 'normal! 0iN' . (line('.')*10) . ' '
答案 4 :(得分:0)
你可以在Vim中轻松完成这个:
:%s/^/\=line(".")*10 . " "/
这将使用表达式的结果替换每一行的开头,该表达式将行号乘以十,后跟一个空格。
我还没有计时,但我怀疑它比其他Vim解决方案明显更快。