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

时间:2015-10-25 17:44:11

标签: regex vim vi

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

57,13,"Bob, Bill and Susan",Student,Club,Funded,64,3200^M

我需要它们看起来像

57,13,Bob-Bill-and-Susan,Student,Club,Funded,64,3200

我正在使用vim正则表达式。我把它分解为4个步骤:

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

    :%s:<ctrl-V><ctrl-M>:\r:g`
    
  2. 将所有替换为-

    :%s: :\-:g
    
  3. 删除引号之间的逗号:需要帮助。

  4. 删除引号:

    :%s:\"\([^"]*\)\":\1:g
    
  5. 如何删除引号之间的逗号,而不删除文件中的所有逗号?

    这样的东西?

    :%s:\("\w\+\),\(\w\+"\):\1 \2:g
    

3 个答案:

答案 0 :(得分:4)

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

要执行此操作,您需要在替换前添加\=,以将替换视为vim表达式。从这里,您可以只提取引号之间的部分,然后分别操作匹配的部分。这需要两个短的正则表达式而不是一个复杂的正则表达式。

:%s/".\{-}"/\=substitute(submatch(0), ',', '' , 'g')/g

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

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

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

在步骤2中,无需更换替换中的-。所以命令只是

:%s/ /-/g

在第4步中,如果您只想删除引号,那么您的正则表达式过于复杂。因为您需要做的只是匹配引号并删除它们

:%s/"//g

答案 1 :(得分:0)

:%s:\("\w*\)\(,\)\(.*"\):\1\3:g删除逗号

答案 2 :(得分:0)

:%s:\("\w*\)\(,\)\(.*"\):\1\3:g

示例:“这是一个例子”

\("\w*\) match start of " every letter following qoutes group \1 for back reference
\(,\) capture comma group \2 for back reference
(.*"\) match every other character upto the second qoute ->group 3 for backreference
:\1\3: only include groups without comma, discard group 2 from returned string which is \2