Vim Substitution

时间:2012-03-07 15:30:07

标签: vim substitution

我一直想知道如何在给定参数内替换。

如果您有这样的一行:

123,Hello,World,(I am, here), unknown

并且您希望将World替换为Foobar,这是一项简单的任务::%s/World/Foobar/

现在我想知道如何摆脱, ( )(

从理论上讲,我只需找到,的第一次出现,然后用)替换{{1}},直到{{1}}。

5 个答案:

答案 0 :(得分:4)

尝试前瞻和后瞻断言:

%s/([^)]*\zs,\ze.*)//

\zs\ze告诉模式开始和结束的位置)

%s/\(([^)]*\)\@<=,\(.*)\)\@=//

第一个更具可读性,第二个使用\( ... \)分组,在组内使用括号,使其看起来像混淆,而\@<=除了是一个不错的ASCII艺术鸭之外,还有后视运算符,以及作为前瞻算子的\@=

参考文献::help pattern:help /\@=:help /\ze等详细信息)

您使用GUI并想尝试这些命令吗?将它们复制到剪贴板并在Gvim中运行:@+

答案 1 :(得分:2)

略微修改@Tom的答案可以给你一个安静的好处&#34;一点&#34;更可读的结果:

%s/\(.*\)(\(.*\),\(.*\))\(.*\)/\1(\2\3)\4/

您将拥有:\1将存储括号内左侧的内容,\4括号外右侧的内容以及\2和{{ 1}}括号内的内容分别位于左侧(\3)和右侧(\2)。

如果您的文件被组织为列,您可以轻松地交换元素。

答案 2 :(得分:1)

您还可以选择要更改的文本(使用visualvisual-block模式),然后输入:以启动替换命令。 vi将使用:'<,'>自动启动命令,该命令将命令应用于所选区域。

替换,可以通过以下方式完成:

:'<,'>s/,/ /g

答案 3 :(得分:0)

对于您的示例,这与@ubuntuguy

建议的相同
%s/\(.*\)(\(.*\),\(.*\)/\1(\2\3

这将完成您想要的确切替换。

答案 4 :(得分:0)

另一种方法,基于实际上您只想替换括号内第一次出现<form method="post" action="<?php echo $_SERVER['$PHP_SELF'];?>"> <div class="form-group"> <label>Student Course</label> <select name="studcourse" class="form-control"> <?php $result = mysql_query("Select setcours, course_desc from tblset, tbl_coursetype where tbl_coursetype.course_no=tblset.setcours group by setcours", $connection); if (!$result) { die("Database query failed: " . mysql_error()); } // 4. Use returned data while ($row = mysql_fetch_array($result)) { echo "<option value=\"{$row[0]}\">{$row[1]}</option>"; } ?> <?php $res=""; $res=$_POST["studcourse"]; ?> </select> </div> <div class="form-group"> <label>Student Year</label> <select name="studyear" class="form-control"> <?php $result = mysql_query("Select setyear, YearName from tblset, tblyear where tblyear.ID=tblset.setyear group by setyear having tblset.setcours=".$res, $connection); if (!$result) { die("Database query failed: " . mysql_error()); } // 4. Use returned data while ($row = mysql_fetch_array($result)) { echo "<option value=\"{$row[0]}\">{$row[1]}</option>"; } ?> </select> </div> 的事实:

,

说明:

  • :%s#\((.\{-}\),#\1 # 代替整个文件(如果您只想使用当前行,请不要使用:%s
  • 我们可以使用%#作为分隔符,使命令更具可读性
  • :中我们要求在左括号后找到任何符号(点),其余代表该符号的0次或更多次出现(尽可能少)。此表达式放在(.\{-}内,以便将来可以将此组称为\(...\)