使用 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","
每行第一次出现。
任何帮助将不胜感激..
谢谢!