sed で行追加する i オプション (と、MacOS の BSD sed での注意点)

sed で行を追加する、i というコマンドを使ってみる。

今回はサンプルとして、cat にヒアドキュメント << を使って複数行のテキストを用意する。コレをパイプで sed に渡し、1行目にテキストを追加してみる。

# まずは普通に出力してみる
$ cat << EOM
> Original
> Text
> EOM
Original
Text

# ↑2行出力される

# 次に sed で行追加してみる
$ cat << EOM | sed -e '1iInserted'
> Original
> Text
> EOM
Inserted
Original
Text

# ↑1行目に「Inserted」と書かれ、3行になる

ファイルを読み込む場合はこのように。

$ cat my-text.txt
Original
File

$ sed -e '1iInserted' my-text.txt
Inserted
Original
File

ファイルに上書きする場合は -i オプションを付け足す。

$ sed -e '1iInserted' -i my-text.txt

-e オプションの方は、「行追加したい行」 + i + 追加したい文字列という書式で書く。だから、3行目に追加したい場合は -e '3iほげほげ' という風になる。

コレは GNU sed の話

ココまで紹介してきた i コマンドは、GNU sed のお話。つまり Linux の sed や、Windows GitBash に同梱される sed の場合だ。MacOS に搭載されている BSD sed で同じコマンドを叩くと、次のようなエラーが出る。

# MacOS 標準の BSD sed を使ってみると…
$ cat << EOM | sed -e '1iInserted'
> Original
> Text
> EOM
sed: 1: "1iInserted
": command i expects \ followed by text

# このように「command i expects \ followed by text」エラーが出る

回避方法はあるようだが、面倒くさい。

だから自分は、以前紹介したように Homebrew で gnu-sed (gsed コマンド) を導入し、コチラを使うようにしている。