【发布时间】:2012-06-16 20:25:52
【问题描述】:
使用 VI 替换第一个匹配项/实例非常简单。
:%s/search/replace/args
但是,这是我的 .csv 格式/文件的数据集:
"192.168.2.1","www.google.com","2009/01/11_10:00"," What a great website"
"192.168.2.2/driving/is/fun","-","2009/03/22_00:00","Driving website"
"192.168.2.4/boating/is/crazy","-","2009/03/22_00:00","Boating Website"
"192.168.2.5","www.cars.com","2009/04/27_00:00","What a good car website"
所以,您会注意到第一行有 4 列,这是 .csv 格式的理想行。
但是,在第二行中,有 4 列,但第一列仅接受 ip 地址,仅此而已,因此必须删除 192.168.2.2/driving/is/fun 或用 "," .csv 分隔符分隔.
在 vi 中,我可以使用以下内容:
:/^"\d\{,3}\.\d\{,3}\.\d\{,3}\.\d\{,3}\//s/\//","/
执行以下操作:
/^"\d{,3}.\d{,3}.\d{,3}.\d{,3}/ - 设置锚点以在第一个 IP 处开始搜索正斜杠 /。例如,第 2 行:“192.168.2.2/
/s///","/ - 替换 IP 地址末尾的 / 并将其替换为 .csv 分隔符 ","
这在 VI/VIM 中效果很好,一次替换了我需要的一行。但是,数据集要大得多,手动使用以下 vi 搜索和替换非常耗时。我正在寻找脚本或找到替代解决方案,因为 VI/VIM 一次只会执行一行,以下 :s/search/replace/g 替换了每行 / 更改日期列。
显然,我尝试了以下方法:
在替换的开头为整个文件添加 %,如下所示:
:/^"\d\{,3}\.\d\{,3}\.\d\{,3}\.\d\{,3}\//%s/\//","/
突出显示我需要修改但出错的每个条目:
E492: Not an editor command: /^"\d\{,3}\.\d\{,3}\.\d\{,3}\.\d\{,3}\//%s/\//
这相当令人困惑。
我最终希望使用 sed/perl 编写脚本,一次性编辑整个文件。
所以..
"192.168.2.2/ --> "192.168.2.2","
每行第一次出现。
任何帮助将不胜感激..
谢谢!
【问题讨论】:
-
只是一个一般性的提示:您可以使用几乎任何字符来分隔您的模式。例如,如果您使用管道,则不必转义斜杠。