我有一个包含以下行的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个步骤:
删除^M
并插入换行符:
:%s:<ctrl-V><ctrl-M>:\r:g`
将所有替换为
-
:
:%s: :\-:g
删除引号之间的逗号:需要帮助。
删除引号:
:%s:\"\([^"]*\)\":\1:g
如何删除引号之间的逗号,而不删除文件中的所有逗号?
这样的东西?
:%s:\("\w\+\),\(\w\+"\):\1 \2:g
答案 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