GNU sedを前提。
pkgではgsed。

マッチさせた文字列を再利用したい

たとえば、以下のようなファイル中の文字列を;

aaaabbb
bbb

こうしたい;

aaaa
bbb
bbb

ここで、行末のbbbを探して\nbbbで変換しようとするとこうなってしまう;

aaaabbb  # ここと
bbb  # ここにマッチ

aaaa
bbb

bbb  # 余計な空行が増える

そこで後方参照を使う。

まず、通常通り表現を作る。
前に任意の一文字があり、行末がbbbで終わるものを書き換える。
つまり正規表現でいうところの.bbb\n\nbbb\nに。

s/.bbb\n/\nbbb\n/

これをそのまま使うとこうなってしまう;

aaa # aが一文字削れてしまう
bbb
bbb

で、後方参照。
使いまわしたい個所をかっこでくくり、1つめなら$1として参照する。
つまり(.)bbb\n$1\nbbb\nに差し替える。

s/(.)bbb\n/$1\nbbb\n/

無事にこうなる

aaaa
bbb
bbb

ファイルの特定行に文字列を挿入する

以下のようなファイルの1行目と2行目の間に文字列を挿入したい場合;

aaa
ccc
ddd

以下のようにする。

$ sed '2ibbb' sample.txt
aaa
bbb
ccc
ddd
$

2iとは2行目にInsert(挿入)するという意味
注意すべきは、挿入したい文字列をコマンドのあとにすぐ続けること。
2i bbbなどとしてはいけない。そのせいで見にくいけど。

出力を別ファイルに。

$ sed '2ibbb' sample.txt > modified.txt
$

複数ファイルの場合には以下のようにする。

$ for i in *; do sed '2ibbb"' $i > /tmp/$i ; done
$

以上