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
$
以上