我一直想知道如何在给定参数内替换。
如果您有这样的一行:
123,Hello,World,(I am, here), unknown
并且您希望将World
替换为Foobar
,这是一项简单的任务::%s/World/Foobar/
现在我想知道如何摆脱,
( )
。(
。
从理论上讲,我只需找到,
的第一次出现,然后用)
替换{{1}},直到{{1}}。
答案 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)
您还可以选择要更改的文本(使用visual
或visual-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次或更多次出现(尽可能少)。此表达式放在(.\{-}
内,以便将来可以将此组称为\(...\)
。