我想用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('(-,-)');">>
我需要提取的数据包含在输入的CCD_ 1部分中。特别是,我对提取括号中的坐标对很感兴趣。
我曾想过使用Vim首先删除title="
之前的所有内容,但我并不是一个真正的正则表达式专家,所以我要问你。如果有人有任何提示,请告诉我!:(
这将用制表符分隔的每行坐标列表替换每行:
:%s/.* title="((d+),(d+))".*/1t2
这个任务可以用一个简单得多的解决方案来实现,只需使用普通命令:
:%normal df(f)D
这意味着:
%
-在所有文件行上运行正常命令normal
-在正常模式下运行以下命令df(
-删除所有内容,直到找到括号(包括括号(f)
-将光标移动到(D
-删除所有内容,直到行尾
您也可以设置一个范围,例如,从第5行运行到第10行:
:5,10normal df(f)D
如果您想要针对这种一次性情况的特别解决方案,只需使用CTRL-v选择视觉块可能会更快。这将允许您选择任意一列文本(在您的情况下,是包含title="(X,Y)"
的列(,然后可以像往常一样使用y
复制该列。
您可以匹配title=((中的所有内容,并丢弃其他内容,如下所示:
:%s,.*title="((.*))".*,1,