假设我有一个配置文件,每行包含空格分隔值。在列上我只有零。例如:
... # 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做事的方式吗?
答案 0 :(得分:8)
您可以使用搜索和替换评估表达式的可能性:
^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矩形编辑命令(虽然分两步而不是一步)。
答案 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 \#
这将为您带来理想的结果,因为\#
替换为完成的替换次数。