要因
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