如何使用Vim或Perl在文件中的特定行上方插入一行?

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做到这一点?

Ken*_*ent 11

vim方式:

cmd :g/<h2>/normal O<hr /> 将完成这项工作.

在这里看到:(我从sudo_O拿了例子)

在此输入图像描述


Chr*_*our 8

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)


rom*_*inl 6

在Vim中做到这一点的众多方法之一:

:g/h2/norm O<hr /><CR>
Run Code Online (Sandbox Code Playgroud)

分解:

  1. :g[lobal]作用于与模式匹配的每一行,请参阅:h :global.

  2. h2 我们正在寻找的模式,可能会变得更聪明一些.

  3. norm[al]运行普通模式命令,请参阅:h :normal.

  4. O在当前行上方打开一个新行并进入插入模式.

  5. <hr /> 是你想要插入的.

  6. 我们点击<CR>(<RETURN>)来运行整个事情.

另一种方法,使用单一替换:

:%s/^\s*<h2/<hr \/>\r&<CR>
Run Code Online (Sandbox Code Playgroud)

分解:

  1. :%s[ubstitute]/在缓冲区的每一行上执行替换,请参阅:h :s.

  2. ^ 将模式锚定到行的开头.

  3. \s*匹配任何数字(0到多个)的空格字符.如果您确定所有HTML标记都在第1列,则不是严格要求的.

  4. <h2 是我们真正想要的模式.

  5. <hr /> 是我们想要插入的.

  6. 既然我们希望它在自己的路线上,那么接下来是a \r,

  7. 最后,匹配的文本,&.