woo*_*ain 4 regex vim perl sed
我想插入这一行
<hr />
Run Code Online (Sandbox Code Playgroud)
在文件中每次出现标题2行时 - 例如,在该模式之上
<h2>variable pattern here</h2>
Run Code Online (Sandbox Code Playgroud)
所以上面应该成为
<hr />
<h2>variable pattern here</h2>
Run Code Online (Sandbox Code Playgroud)
我怎么能用Vim,Sed或Perl做到这一点?
随sed你可以做sed '/<h2>/i <hr />':
$ cat file
<html>
<h2>variable pattern here</h2>
<h3>not here</h3>
<h2>heading</h2>
<h2>Something</h2>
$ sed '/<h2>/i <hr />' file
<html>
<hr />
<h2>variable pattern here</h2>
<h3>not here</h3>
<hr />
<h2>heading</h2>
<hr />
<h2>Something</h2>
Run Code Online (Sandbox Code Playgroud)
第一部分/<h2>/匹配包含行<h2>,第二部分使用i命令<hr />在匹配行上方插入.
一个不错的选择sed是-i将更改保存回文件而不是打印到,stdout但要确保更改是正确的.
sed -i '/<h2>/i <hr />' file
Run Code Online (Sandbox Code Playgroud)
在Vim中做到这一点的众多方法之一:
:g/h2/norm O<hr /><CR>
Run Code Online (Sandbox Code Playgroud)
分解:
:g[lobal]作用于与模式匹配的每一行,请参阅:h :global.
h2 我们正在寻找的模式,可能会变得更聪明一些.
norm[al]运行普通模式命令,请参阅:h :normal.
O在当前行上方打开一个新行并进入插入模式.
<hr /> 是你想要插入的.
我们点击<CR>(<RETURN>)来运行整个事情.
另一种方法,使用单一替换:
:%s/^\s*<h2/<hr \/>\r&<CR>
Run Code Online (Sandbox Code Playgroud)
分解:
:%s[ubstitute]/在缓冲区的每一行上执行替换,请参阅:h :s.
^ 将模式锚定到行的开头.
\s*匹配任何数字(0到多个)的空格字符.如果您确定所有HTML标记都在第1列,则不是严格要求的.
<h2 是我们真正想要的模式.
<hr /> 是我们想要插入的.
既然我们希望它在自己的路线上,那么接下来是a \r,
最后,匹配的文本,&.