1

可能重复:
在 vi/vim 中保留某些“单词”的同时替换

假设我有几行像

            $adv_id;
            $am_name; 
            $campaign_ids;
            $repeat_on;
            $opt_days;
            $opt_time;
            $am_or_pm;

假设我使用可视模式选择所有行..如何在每行的开头和结尾添加字符,使其看起来像

        $_REQUEST($adv_id);
        $_REQUEST($am_name; 
        $_REQUEST($campaign_ids);
        $_REQUEST($repeat_on;
        $_REQUEST($opt_days);
        $_REQUEST($opt_time);
        $_REQUEST($am_or_pm);
4

2 回答 2

4

与您的其他问题非常相似,因此那里的解释应该可以帮助您理解这个替代品。将线条选为可视块,使用以下替代命令:

:'<,'>s/\$\(.*\);/$_REQUEST(\1);

和以前一样,'<,'>如果您有视觉选择,则会在命令行中为您自动填充。

这里的不同之处在于我们使用\(\)了一个捕获组,它将捕获部分正则表达式,并在替换中再次使用它, using\1指的是第一个捕获组。

此外,由于此正则表达式使用$字面来定位替换,因此需要对其进行转义:\$,因为它在正则表达式中具有特殊含义:end of line

如果您需要在一行中有多个g替换,则需要添加标志,并且您可能需要删除分号:

:'<,'>s/\$\(.*\);/$_REQUEST(\1)/g

反向正则表达式,例如用 替换$_REQUEST($adv_id);$adv_id;非常相似:

:'<,'>s/\$_REQUEST(\(.*\))/\1

在这里,我们在捕获组中捕获 a 中括号之间的所有内容$_REQUEST(...);,并且该捕获组是整个替换。

于 2012-10-11T18:03:50.240 回答
1

在可视模式下,:在命令行中点击并使用它:

:'<,'>s/^\(.*\);$/$_REQUEST(\1);/g

\(并捕获该\)行的匹配表达式,并\1在替换中调用捕获的组。

使用:'<,'>告诉 Vim 通过以下命令(s在本例中)过滤当前选择。

于 2012-10-11T18:04:24.457 回答