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

时间:2013-06-04 14:54:20

标签: 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

现在我想用它的索引增加第二列。 这就是我想要的结果:

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

如何在emacs lisp中使用它?或者任何其他Emacsen做事的方式吗?

6 个答案:

答案 0 :(得分:8)

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

  • 将要点放在要处理的第一行
  • M-x query-replace-regexp RET
  • 搜索字符串:^0 \([0-9]+\)
  • 替换为:\,(format "0 %s" (+ \#1 \#))

意思是:

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

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

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

答案 1 :(得分:7)

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

运行它

所以在你的情况下,将点移动到第一个有趣的行的开头,点击 F3 Cf Cf Cd F3 Cn Ca F4 (即删除第二个零点,插入计数器,然后移到开头下一行)。然后根据需要多次按 F4 来更改所有行。

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

答案 2 :(得分:5)

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

  • 设置标记并指向列矩形的角落
  • C-x r k 删除矩形。
  • C-u C-x r N 在其位置插入数字序列。

另见相关问题:
emacs string-insert-rectangle vector of numbers?

答案 3 :(得分:4)

使用org-mode可以做的事情(我不确定你将如何使用结果,但这可以是一种方法)

| N | X | file | stream     |                ip |
|---+---+------+------------+-------------------|
| 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 |
#+TBLFM: $2=@#-2

一些解释,或者更确切地说,如何获取原始数据并将其转换为此表:

  • 将您的数据复制到文件config.org

  • 通过基本字符串替换命令创建表。 (只需复制现在的文本,选择所有文本然后 C-c |

  • #+TBLFM:部分是此表的“公式”,它表示以下内容:为第二列中的每个单元格指定其行的序号减去2(它们开始计数行为1,这个表有一个标题行。

  • 每当你在公式上 Cc Cc 时,它都会重新将它应用到表中(这样你可以在修改文档时附加更多行,重新应用公式会自动更新表)。

答案 4 :(得分:2)

您可以使用cua-set-rectangle-mark

评估:

(cua-mode 't)

然后在缓冲区中,您可以在第二列使用M-x cua-set-rectangle-mark,然后将矩形向下扩展到列表的末尾。

然后使用M-n(序列),Start (0):Increment (1):Format (%d):的默认值都会提供您在这种情况下所需的内容。

答案 5 :(得分:0)

这是一种非常简单的方法(使用与Seki's answer相同的技术,但更容易):

选择要显示增量的所有行,然后发出

M-x replace-regexp "^0 0" "0 \#"

或更详细:

  • M-x replace-regexp RET
  • 搜索到的字符串:^0 0
  • 替换为:0 \#

这将为您带来理想的结果,因为\#替换为完成的替换次数。