7

行を挿入したい

<hr />

ファイル内のヘッダー2行のすべての出現の上-たとえば、このパターンの上

<h2>variable pattern here</h2>

したがって、上記は

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

Vim、Sed、Perlでこれを行うにはどうすればよいですか?

4

6 に答える 6

12

vimの方法:

cmd:g/<h2>/normal O<hr /> がその仕事をします。

ここを参照してください:(私はsudo_Oから例を取りました)

ここに画像の説明を入力してください

于 2013-01-15T09:52:51.420 に答える
9

あなたと一緒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>と一致し、2番目の部分はiコマンドを使用し<hr />て一致した行の上に挿入します。

の良いオプションsed-i、これを印刷する代わりにファイルに変更を保存するstdoutことですが、最初に変更が正しいことを確認してください。

sed -i '/<h2>/i <hr />' file
于 2013-01-15T09:42:48.370 に答える
8

Vimでそれを行う多くの方法の1つ:

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

壊す:

  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>

壊す:

  1. :%s[ubstitute]/バッファのすべての行で置換を実行します。を参照してください:h :s

  2. ^パターンを行の先頭に固定します。

  3. \s*任意の数(0から多数)の空白文字に一致します。すべてのHTMLタグが列1にあることが確実な場合は、厳密には必要ありません。

  4. <h2私たちが本当に探しているパターンです。

  5. <hr />挿入したいものです。

  6. 独自の行にしたいので、その後に\r、、

  7. そして最後に、一致したテキスト、&

于 2013-01-15T09:54:50.717 に答える
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;
于 2013-01-15T09:46:00.180 に答える
3

Perlのコマンドラインソリューション。

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

コマンドラインフラグの説明:

  • -iインプレース編集(既存のファイルを置き換える)、your_file.htmlへのバックアップ〜
  • -pファイルの各行を印刷します
  • -eファイルの各行に対して実行するコード

行に(/<h2>/)が含まれている場合は、その前に追加<hr />します(現在の行は$ _にあります)。

しかし、これが最善のアプローチであるかどうかを検討しましたか?すべてのH2要素の上に行を追加したい場合は、CSSを使用して追加する必要がありますか?

于 2013-01-15T10:50:16.860 に答える
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
于 2013-01-15T10:50:51.820 に答える