LoginSignup
15

More than 5 years have passed since last update.

Linux(GNU)とMac(BSD)のsedの振る舞いの違いを解決

Last updated at Posted at 2015-06-18

要因

sedでファイルを直接書き換えようとした際に、-iのサフィックスの振る舞いが
Linux(GNU)とMac(BSD)で異なる。

GNU

$ sed -i -e “s/aaa/bbb/g” test.txt

BSD

$ sed -i “” -e “s/aaa/bbb/g” test.txt

-iのサフィックスにはバックアップファイル名を指定する。
例えば、”.bak”を指定するとtest.txt.bakが生成される。

GNUはサフィックス無しで、バックアップファイル作成しないが、
BSDはサフィックス無しが許容されず、空文字を指定しなければいけない。

例えば、BSDでGNUと同じ式を使ってしまうと意図しないバックアップファイルが作成される。

BSD

$ sed -i -e “s/aaa/bbb/g” test.txt
$ ls
test.txt test.txt-e

test.txt-eという意図しないバックアップファイルが作成されている。

解決

この振る舞いの違いを解決させるには、aliasを使用する。

bash_profileに設定する場合。

if sed --version 2>/dev/null | grep -q GNU; then
  alias sedi='sed -i '
else
  alias sedi='sed -i "" '
fi

使用するスクリプト内に設定する場合。

#!/bin/bash

# bashでalias機能をONにする
shopt -s expand_aliases

if sed --version 2>/dev/null | grep -q GNU; then
  alias sedi='sed -i '
else
  alias sedi='sed -i "" '
fi

sedi -e “s/aaa/bbb/g” test.txt

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15