如何在配置文件中的同一行增加一系列数字?

yve*_*mes 5 emacs elisp

假设我有一个配置文件,每行包含空格分隔值.在列上我只有零.例:

... # there is more configuration before the interesting stuff:
0 0 file /dev/stdin 224.0.68.54:12131
0 0 file /dev/stdin 224.0.68.55:12102
0 0 file /dev/stdin 224.0.68.49:12333
0 0 file /dev/stdin 224.0.68.60:12184
0 0 file /dev/stdin 224.0.68.62:12888
0 0 file /dev/stdin 224.0.68.77:12001
0 0 file /dev/stdin 224.0.68.33:12973
Run Code Online (Sandbox Code Playgroud)

现在我想用它的索引增加第二列.那是我想要的结果:

0 0 file /dev/stdin 224.0.68.54:12131
0 1 file /dev/stdin 224.0.68.55:12102
0 2 file /dev/stdin 224.0.68.49:12333
0 3 file /dev/stdin 224.0.68.60:12184
0 4 file /dev/stdin 224.0.68.62:12888
0 5 file /dev/stdin 224.0.68.77:12001
0 6 file /dev/stdin 224.0.68.33:12973
Run Code Online (Sandbox Code Playgroud)

如何在emacs lisp中做到这一点?或者其他任何Emacsen做事的方式吗?

Sek*_*eki 8

您可以使用搜索和替换评估表达式的可能性:

  • 把重点放在要处理的第一行
  • M-x 查询替换,正则表达式 RET
  • 搜索字符串: ^0 \([0-9]+\)
  • 用...来代替: \,(format "0 %s" (+ \#1 \#))

意思是:

  • 在行的开头搜索前面有一个零的数字
  • 替换为评估结果,其中\#1第一个匹配的组(如\ 1但转换为数字)\#是已经完成的替换次数(从第一次替换的0开始).针对每个匹配评估表达式.

如果第一个数字不总是零,我会使用:

  • 搜索字符串: ^\([0-9]+\) \([0-9]+\)
  • 用...来代替: \,(format "%s %s" \#1 (+ \#2 \#))


leg*_*cia 7

您可以使用带计数器的宏来执行此操作.您开始使用定义宏F3并使用结束定义F4.在定义宏时,F3再次点击将插入计数器的值并递增它.定义宏后,通过点击运行它F4.

因此,在您的情况下,将点移动到第一个有趣行的开头,点击F3 C-f C-f C-d F3 C-n C-a F4(即删除第二个零,插入计数器,然后移动到下一行的开头).然后F4根据需要多次击中以更改所有线条.

如果您需要更改计数器的值,请使用M-x kmacro-set-counter.


phi*_*ils 5

与Jonathan Leech-Pepin的回答类似,您也可以使用非cua矩形编辑命令(虽然分两步而不是一步).

  • 设置标记并指向列矩形的角
  • C-xrk 删除矩形.
  • C-uC-xrN 在其位置插入数字序列.

另请参阅相关问题:
emacs string-insert-rectangle数字向量?