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

时间:2013-01-15 09:38:38

标签: regex perl vim sed

我想插入一行

<hr />

在文件中每次出现标题2行时 - 例如,高于此模式

<h2>variable pattern here</h2>

所以上面应该成为

<hr />
<h2>variable pattern here</h2>

如何使用Vim,Sed或Perl执行此操作?

6 个答案:

答案 0 :(得分:10)

vim方式:

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

在此处查看:(我从sudo_O中获取了示例)

enter image description here

答案 1 :(得分: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>

第一部分/<h2>/匹配包含<h2>的行,第二部分使用i命令在匹配的行上方插入<hr />

sed的一个不错的选项是-i这会将更改保存回文件而不是打印到stdout,但请确保更改是正确的。

sed -i '/<h2>/i <hr />' file

答案 2 :(得分:6)

在Vim中执行此操作的众多方法之一:

:g/h2/norm O<hr /><CR>

故障:

  1. :g[lobal]会对与模式匹配的每一行采取行动,请参阅:h :global

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

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

  4. O在当前行上方打开一个新行,然后进入 insert 模式。

  5. <hr />是您要插入的内容。

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

  7. 另一种方式,使用单一替换:

    :%s/^\s*<h2/<hr \/>\r&<CR>
    

    故障:

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

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

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

    4. <h2是我们真正寻找的模式。

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

    6. 由于我们希望它在自己的行上,然后是\r

    7. ,最后是匹配的文字&

答案 3 :(得分:3)

use strict;
use warnings;
use Tie::File;

tie my @file, 'example.html'
  or die "Unable to tie file: $!";

@file = map { m!<h2>.*</h2>!
            ? ( "<hr />", $_ )
            : $_ } @file;

untie @file;

答案 4 :(得分:3)

Perl中的命令行解决方案。

perl -i~ -p -e'/<h2>/ and $_ = "<hr />\n$_"' your_file.html

命令行标志的说明:

  • -i 就地编辑(替换现有文件),备份到your_file.html~
  • -p 打印文件中的每一行
  • -e 要为文件中的每一行执行的代码

如果该行包含(/<h2>/),则在其前面添加<hr />(当前行在$ _中)。

但你有没有考虑过这是最好的方法?如果你想在每个H2元素上面添加一行,那么也许你应该用CSS做到这一点?

答案 5 :(得分:1)

perl -plne 'print "<hr />" if(/\<h2\>variable pattern here\<\/h2\>/)' your_file

输入文件:

> cat temp
<h2>variable pattern here</h2>
1
<h2>variable pattern here</h2>
2
<h2>variable pattern here</h2>
3
4
<h2>variable pattern here</h2>

现在执行

> perl -plne 'print "<hr />" if(/\<h2\>variable pattern here\<\/h2\>/)' temp
<hr />
<h2>variable pattern here</h2>
1
<hr />
<h2>variable pattern here</h2>
2
<hr />
<h2>variable pattern here</h2>
3
4
<hr />
<h2>variable pattern here</h2>

这将只输出到控制台。 如果你想在里面改变它:

perl -pi -lne 'print "<hr />" if(/\<h2\>variable pattern here\<\/h2\>/)' your_file