6

我想用vim从文本中提取一些数据。数据是这样的:

72" title="(168,72)" onmouseover="posizione('(168,72)');" onmouseout="posizione('(-,-)');">>
72" title="(180,72)" onmouseover="posizione('(180,72)');" onmouseout="posizione('(-,-)');">>
72" title="(192,72)" onmouseover="posizione('(192,72)');" onmouseout="posizione('(-,-)');">>
72" title="(204,72)" onmouseover="posizione('(204,72)');" onmouseout="posizione('(-,-)');">>

我需要提取的数据包含在:title="(168,72)" 中。
特别是我有兴趣只提取这些坐标。

我虽然关于使用 vim 首先删除title=" .. 之前的所有内容,但我并不是真正的正则表达式大师 .. 所以我问你:如果有人有任何提示:请告诉我 :)

4

4 回答 4

4

这将用制表符分隔的每行坐标列表替换每一行:

:%s/.* title="(\(\d\+\),\(\d\+\))".*/\1\t\2
于 2011-07-03T18:50:12.967 回答
4

这个任务可以通过一个更简单的解决方案和使用普通命令的几个按键来完成:

:%normal df(f)D

这表示:

  1. %- 在所有文件行上运行正常命令;
  2. normal- 在正常模式下运行以下命令;
  3. df(- 删除所有内容,直到找到括号(包括括号);
  4. f)- 将光标移动到 );
  5. D- 删除所有内容,直到行尾。

您还可以设置一个范围,例如,从第 5 行运行到第 10 行:

:5,10normal df(f)D
于 2011-07-04T17:19:23.727 回答
3

如果您想要针对这种一次性情况的临时解决方案,只需使用CTRL-v. 这将允许您选择任意文本列(在您的情况下,包含 的列title="(X,Y)"),然后可以像往常一样使用y.

于 2011-07-03T19:31:12.493 回答
0

您可以匹配 title=() 中的所有内容并丢弃其他所有内容,如下所示:

:%s,.*title="(\(.*\))".*,\1,
于 2011-07-03T18:52:55.930 回答