用Emacs交换2列

时间:2010-11-22 14:41:00

标签: emacs

我有两列,用逗号分隔。如何将这些列与Emacs交换?

我有以下内容:

  column 1,column2
  x1,x2
  y1,y2
  f1,f2

我希望这样:

 column2,column 1
 x2,x1
 y2,y1
 f2,f1

5 个答案:

答案 0 :(得分:11)

使用M-x query-replace-regexp然后:

\(.+\),\(.+\)

替换正则表达式和

\2,\1

替换。


在Emacs中,您需要使用\转义分组括号。因此,上面的正则表达式通常写为

(.+),(.+)

表示您希望第一组中逗号之前的所有内容和第二组中逗号之后的所有内容。

\2,\1

表示:写第二组,然后写逗号,然后写第一组。

答案 1 :(得分:5)

虽然您可以应用其他人提供的技术,但您也可以使用组织模式表。 将数据转换为org-mode表后,通过简单的按键交换列非常容易。您可以使用M-x组织模式,选择区域然后执行M-x org-table-convert-region,然后选择最右侧的M-。我不确定如何将数据导出为CSV,但使用replace-regexp应该非常容易。这可能会有所帮助:http://www.gnu.org/software/emacs/manual/html_node/org/Tables.html#Tables

答案 2 :(得分:3)

与@darioo给出的答案类似,在缓冲区顶部输入以下内容:

(query-replace-regexp "\\(.*?\\),\\(.*\\)" "\\2,\\1")

然后,将光标放在此行的末尾,然后按ctrl-x,ctrl-e。

您将进行交互式搜索和替换,按空格键进行更改,然后按ctrl-g退出。如果您按!(感叹号),则搜索将停止互动并发生在所有匹配的文本上。

如果要撤消更改,请按M-x(通常是ESC,然后按x)并输入undo并按Enter键。

答案 3 :(得分:3)

Emacs有一个矩形选择模式,例如参见:http://emacs-fu.blogspot.com/2008/12/working-with-rectangular-selections.html

更好的是,如果启用cua模式,输入Ctrl-Enter将使您处于非常容易使用的矩形选择模式。

http://trey-jackson.blogspot.com/2008/10/emacs-tip-26-cua-mode-specifically.html

答案 4 :(得分:3)

使用宏!

  • 转到缓冲区的第一行
  • 开始录制宏(F3)
  • 移至行的开头(^ a)
  • 搜索逗号(^ s,)
  • 转置(M-t)
  • 将光标向下移动一行
  • 停止录制宏(F4)

选择其余行并:

M-x apply-macro-to-region-lines

更新:如果列中有多个单词,则无法正常工作。寻找更通用的解决方案......