行を挿入したい
<hr />
ファイル内のヘッダー2行のすべての出現の上-たとえば、このパターンの上
<h2>variable pattern here</h2>
したがって、上記は
<hr />
<h2>variable pattern here</h2>
Vim、Sed、Perlでこれを行うにはどうすればよいですか?
vimの方法:
cmd:g/<h2>/normal O<hr />
がその仕事をします。
ここを参照してください:(私はsudo_Oから例を取りました)
あなたと一緒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
Vimでそれを行う多くの方法の1つ:
:g/h2/norm O<hr /><CR>
壊す:
:g[lobal]
パターンに一致するすべての行に作用します。を参照してください:h :global
。
h2
私たちが探しているパターンは、おそらく少し賢くすることができます。
norm[al]
通常モードコマンドを実行します。を参照してください:h :normal
。
O
現在の行の上に新しい行を開き、挿入モードに入ります。
<hr />
挿入したいものです。
<CR>
( )を押し<RETURN>
てすべてを実行します。
別の方法として、単一の置換を使用します。
:%s/^\s*<h2/<hr \/>\r&<CR>
壊す:
:%s[ubstitute]/
バッファのすべての行で置換を実行します。を参照してください:h :s
。
^
パターンを行の先頭に固定します。
\s*
任意の数(0から多数)の空白文字に一致します。すべてのHTMLタグが列1にあることが確実な場合は、厳密には必要ありません。
<h2
私たちが本当に探しているパターンです。
<hr />
挿入したいものです。
独自の行にしたいので、その後に\r
、、
そして最後に、一致したテキスト、&
。
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;
Perlのコマンドラインソリューション。
perl -i~ -p -e'/<h2>/ and $_ = "<hr />\n$_"' your_file.html
コマンドラインフラグの説明:
行に(/<h2>/
)が含まれている場合は、その前に追加<hr />
します(現在の行は$ _にあります)。
しかし、これが最善のアプローチであるかどうかを検討しましたか?すべてのH2要素の上に行を追加したい場合は、CSSを使用して追加する必要がありますか?
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