vim :s 命令与正则表达式选择第二次出现的字符

问题描述 投票:0回答:2

我想要下面的这段文字:-

119, 'Youth Campus,Janakpur', Janakpur  
978, 'Yog Kumar Janta Campus, Balwa-3', Mahottari  
806, 'Yerawati Aadarsha Multiple Campus, Lalmatiya Deukhuri, Dang', Dang  
613, 'Yasok Campus, Yasok, Panchther', Panchthar  
458, 'Yagyodaya Dudhnath Tharu Multiple Campus,Suddhodhan-3,Ramawapur', Rupandehi  
1008, 'Yagnyabhumi Multiple Campus, Dharapani', Dhanusha  
546, 'Xavier International College, Kamalpokhari,kath', Kathmandu  
362, 'Xavier Academy Science College, Lazimpat, Kathmandu', Kathmandu  

更改为:-

119, 'Youth Campus', Janakpur  
978, 'Yog Kumar Janta Campus', Mahottari  
806, 'Yerawati Aadarsha Multiple Campus', Dang  
613, 'Yasok Campus', Panchthar  
458, 'Yagyodaya Dudhnath Tharu Multiple Campus', Rupandehi  
1008, 'Yagnyabhumi Multiple Campus', Dhanusha  
546, 'Xavier International College', Kathmandu  
362, 'Xavier Academy Science College', Kathmandu  

使用 vim

:s
命令。为此,我需要删除第二个
,
之后的字符,直到右侧的
'
字符。 如何使用正则表达式指定此条件?

:s/,.*',/,/g
删除
'
内的整个文本。并且
:%s/,.*'/','/g
也无法按预期工作。

我需要一个替代命令来获取结果以及正则表达式如何工作/功能的一些解释!

regex vim substitution
2个回答
1
投票

我建议

:%s/\v^(\d+,\s*'[^',]*).*(',[^,]*)$/\1\2/g

请参阅此正则表达式的 PCRE 等效演示

详情

  • ^
    - 字符串的开头(Vim 中的行)
  • (\d+,\s*'[^',]*)
    - 第 1 组:一位或多位数字、逗号、零个或多个空格、
    '
    ,然后是除
    '
    ,
  • 之外的零个或多个字符
  • .*
    - 任何零个或多个尽可能多的字符
  • (',[^,]*)
    - 第 2 组:
    ',
    + 除
    ,
    之外的尽可能多的零个或多个字符
  • $
    - 字符串的结尾(此处为行)。

1
投票

我建议这种简单的方法:

:%s/,[^']\+\ze',//g

:set incsearch hlsearch
的帮助下…

  1. ,
    匹配冒号:

    嗯,匹配太多了……

  2. [^']\+
    匹配一个或多个非直引号字符:

    嗯,比赛还是太多了……

  3. ',
    匹配直引号后跟冒号:

    我们快到了……

  4. \ze
    有点难以解释。基本上,您有一个与完整正则表达式相对应的“真实”匹配,以及一个忽略
    \ze
    之后的任何内容的“实际”匹配。在这里,我们用它来停止
    ',
    之前的实际比赛:

FWIW,在这种情况下,最后两个斜杠和

g
是不必要的,因为:

  • 没有替代品,
  • 每行只有一场比赛。

因此,您可以放心地选择:

:%s/,[^']\+\ze',
© www.soinside.com 2019 - 2024. All rights reserved.