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」エラーが出る
回避方法はあるようだが、面倒くさい。
- 参考 : Sedで1行追加 - JanGaJan.com
- 参考 : sedでファイルに行を挿入する
- 参考 : https://doruby.jp/users/tmatsuzawa_on_rails/entries/MacOSX___sed__1
- 参考 : sedで改行を出力する
- 参考 : BSD sedで行挿入
だから自分は、以前紹介したように Homebrew で gnu-sed
(gsed
コマンド) を導入し、コチラを使うようにしている。