将正则表达式替换中的g标志限制为部分行?

时间:2017-09-24 18:25:56

标签: regex vim

我有一个这样的文件:

"File_name_1.dat"       "File_name_1.dat"
"File_name_2.dat"       "File_name_2.dat"
"Some_other_thing.dat"  "Some_other_thing.dat"

我是否可以使用正则表达式技术仅在每行的第二个文件名中替换下划线,如下所示?

"File_name_1.dat"       "File name 1.dat"
"File_name_2.dat"       "File name 2.dat"
"Some_other_thing.dat"  "Some other thing.dat"

我尝试匹配列(Vim中的\%XXc),但它似乎禁用了g标志。

这只会替换第25列之后的第一个下划线:

:%s/\%25c\([^_]*\)\zs_/ /g

这只替换了该行中的最后一个下划线:

:%s/\%25c\(.*\)\zs_/ /g

我知道我可以重复这个命令直到它们消失,但我想知道是否有一种更为灵巧的方法。

2 个答案:

答案 0 :(得分:2)

是的,通过视觉选择可以轻松实现此目的。很方便您的数据布局,否则这将无法正常工作。

  • 直观地选择所有第二个文件名

  • 运行此正则表达式:

    :'<,'>s/\%V_/ /g
    

    \%V会将您的替代品限制在当前视觉选择的内部。这是我的意思的屏幕截图:

enter image description here

答案 1 :(得分:1)

可能有很多方法可以做到这一点。由于数据格式很好,我可能会直观地选择并删除第一列(<c-v>),然后运行:%s/_/ /g。然后粘贴第一列。

如果您真的想在单个正则表达式中执行此操作,则需要使用lookbehind

:%s/\(\%25c.\{-}\)\@<=_/ /g

如果前面的元素匹配,\@<=匹配。 :help \@<=