在VIM中在行的前面和末尾添加单词

时间:2012-10-11 18:00:33

标签: vim replace substitution

  

可能重复:
  Replace while keeping certain “words” in 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);

2 个答案:

答案 0 :(得分:4)

与你的other question非常相似,所以那里的解释应该有助于你理解这个替代品。选择行作为可视块,使用此替换命令:

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

如前所述,如果您有视觉选择,'<,'>将在命令行中为您自动填充。

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

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

如果您需要在一行上进行多个替换,则需要添加\$标记,并且可能需要删除分号:

g

反向正则表达式,例如将:'<,'>s/\$\(.*\);/$_REQUEST(\1)/g 替换为$_REQUEST($adv_id);,非常相似:

$adv_id;

在这里,我们捕获捕获组中:'<,'>s/\$_REQUEST(\(.*\))/\1 中的parens之间的所有内容,并且捕获组是整个替换。

答案 1 :(得分:1)

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

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

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

使用:'<,'>告诉Vim通过以下命令过滤当前选择(在这种情况下为s)。