使用vim正则表达式删除引号之间的所有逗号

saw*_*yer 1 regex vi vim

我有一个包含以下内容的CSV文件:

57,13,"Bob, Bill and Susan",Student,Club,Funded,64,3200^M
Run Code Online (Sandbox Code Playgroud)

我需要他们看起来像

57,13,Bob-Bill-and-Susan,Student,Club,Funded,64,3200
Run Code Online (Sandbox Code Playgroud)

我正在使用vim正则表达式。我将其分为4个步骤:

  1. 删除^M并插入换行符:

    :%s:<ctrl-V><ctrl-M>:\r:g`
    
    Run Code Online (Sandbox Code Playgroud)
  2. 全部替换-

    :%s: :\-:g
    
    Run Code Online (Sandbox Code Playgroud)
  3. 删除引号之间的逗号:在此处需要帮助。

  4. 删除引号:

    :%s:\"\([^"]*\)\":\1:g
    
    Run Code Online (Sandbox Code Playgroud)

如何删除引号之间的逗号,而不删除文件中的所有逗号?

像这样吗

:%s:\("\w\+\),\(\w\+"\):\1 \2:g
Run Code Online (Sandbox Code Playgroud)

FDi*_*off 5

我对此问题的首选解决方案(删除引号区域内的逗号)是使用带表达式的替换,而不是尝试在一个正则表达式中完成此操作。

为此,您需要在替换之前加上前缀,\=以使替换被视为vim表达式。在这里,您可以仅提取引号之间的部分,然后分别操作匹配的部分。这需要有两个简短的正则表达式,而不是一个复杂的正则表达式。

:%s/".\{-}"/\=substitute(submatch(0), ',', '' , 'g')/g
Run Code Online (Sandbox Code Playgroud)

因此".\{-}",将引号substitute(submatch(0), ',', '' , 'g')中的所有内容匹配(非贪婪),并采用匹配的内容并删除所有逗号,并将其返回值用作实际替换。

相关的帮助页面是:help sub-replace-special


至于您问题的其他部分。步骤1本质上是尝试删除所有回车符,因为文件格式实际上是dos文件格式。您可以使用该dos2unix程序将其删除。

在步骤2 -中,不必在替换中使用。所以命令就是

:%s/ /-/g
Run Code Online (Sandbox Code Playgroud)

在第4步中,如果您要做的只是删除引号,则您的正则表达式过于复杂。由于您所需要做的就是匹配引号并将其删除

:%s/"//g
Run Code Online (Sandbox Code Playgroud)