用vim中的匹配分隔符替换单个字符

时间:2018-06-26 18:06:24

标签: vim

我有一个csv文件,其中某些单元格在,之间包含"..."。我只需要将引号之间的逗号更改为分号,而不必替换该行上的其余逗号。也就是说,我有这样的东西:

x,"y,z",a

只有yz之间的逗号应替换为;。在vim中应该怎么做?

3 个答案:

答案 0 :(得分:4)

对于每行一对引号,您可以使用:

allOf().get()

输入:

public void newInit() throws ExecutionException, InterruptedException {
    CompletableFuture cf1 = CompletableFuture.supplyAsync(() -> {
        return 1L;
    }).thenAccept(result -> {
        this.result1 = result;
    });
    CompletableFuture cf2 = CompletableFuture.supplyAsync(() -> {
        return 2L;
    }).thenAccept(result -> {
        this.result2 = result;
    });
    CompletableFuture.allOf(cf1, cf2).get();
}

输出:

%s/\v("[^"]*)@<=,(.*")@=/;/g

对于每行多于一对引号,您可以使用以下awk命令:

x,"y,z,a",b

此命令基于Unix StackExchange中的问题。它将设置引号x,"y;z;a",b 作为字段分隔符,并使用:!awk -F'"' -v OFS='"' '{ for (i=2; i<=NF; i+=2) gsub(",", ";", $i) } 1' infile > outfile 在每个其他字段中替换逗号。

答案 1 :(得分:1)

通过:s函数调用此vim命令substitute()可以轻松完成这项工作:

%s/"\zs[^"]*/\=substitute(submatch(0),',',';','g')

例如:

enter image description here

答案 2 :(得分:0)

如果双引号之间只有一个逗号,并且每行不超过一个匹配项,则以下替换命令应该起作用:

:%s/\(".*\),\(.*"\)/\1;\2/