我有一个如下所示的文件:
Stroszek;12/01/1977;5.74;Drama,Comedy;7.142;Bruno S.(2),Eva Mattes(1),50 Cent(2),Wilhelm von Homburg(2),Burkhard Driest(2),Clayton Szalpinski(0),Ely Rodriguez(0),Alfred Edel(0),Scott McKain(0),Pitt Bedewitz(0),Ralph Wade(0),Michael Gahr(2),Vaclav Vojta(0),Yüksel Topcugürler(0)
Patients;01/03/2017;5.889;Drama,Comedy;25.000;Pablo Pauly(2),Soufiane Guerrab(2),Moussa Mansaly(2),Nailia Harzoune(1),Franck Falise(0),Yannick Renier(2),Alban Ivanov(2),Jason Divengele(0),Côme Levin(2),Dominique Blanc(1),Anne Benoît(1),Rabah Nait Oufella(2)
Carnage;16/09/2011;9.4;Drama,Comedy;45.454;Kate Winslet(1),Jodie Foster(1),Christoph Waltz(2),John C. Reilly(2),Elvis Polanski(0),Eliot Berger(0),Julie Adams(1),Joseph Rezwin(2),Tanya Lopert(1),Nathan Rippy(2),Lexie Kendrick(1)
我想使用 vim 命令将其转换为如下所示:
Stroszek;12/01/1977;5.74;Drama,Comedy;7.142;21222000000200
Patients;01/03/2017;5.889;Drama,Comedy;25.000;222102202112
Carnage;16/09/2011;9.4;Drama,Comedy;45.454;11220012121
我希望文件末尾的数字是第一个文件中括号内的数字。问题是由于第一行中的 50 cent 中的 '50',我不能删除除第六个字段中的数字之外的所有内容,因为那样会保留 50。
我尝试过如下命令:
:%s/\v(.*)(\(\d\))(.*)/\=substitute(submatch(2), '\D', '', 'g')/g
和 :
:%s/\v(.*)(\(\d\))(.*)/\2/g
但似乎都无法正常工作。有人知道该怎么做吗?
你的命令不起作用的主要原因是你的模式太贪婪了。它匹配整行,但只剩
\2
下最后一行。让模式不那么贪婪肯定会有所帮助:
但它仍然会丢弃前 5 个字段,这不是您想要的。
这是一个可行的替代方案:
该模式的第一部分
^\(.\{-};\)\{,5\}\zs
:^
,\(.\{-};\)\{,5\}
,:help \zs
。模式的第二部分
.*
匹配该行的剩余部分。由于\zs
,模式的实际匹配只是该部分。替换对整个匹配执行另一次替换 (
submatch(0)
),其中:.\{-}(\(\d*\))
匹配任意Bruno S.(2)
或,50 Cent(2)
,捕获括号之间的数字,\1
用捕获的数字替换整个匹配项,g
确保替换适用于所有比赛。