Edited at

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

More than 3 years have passed since last update.


要因

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