インソースマーケティングデザイン
2018.04.10 システム
Macローカルでsed置換すると「sed: 1: invalid command code R」になる時の対処方法
マリンロードスタッフブログをご覧いただいている皆様、こんにちは。
フロントエンドエンジニアの虎澤です。
先日、Macのローカル環境内で、ターミナルからsedを使って一括置換する作業を行いました。
例えば、以下のようなコマンドを打ったとします。
find . -type f -print0 | xargs -0 grep -l hoge | xargs -t -I{} sed -i ‘s#hoge#hogehoge#g’ “{}”;
すると、「sed: 1: invalid command code R」というエラーが出てしまいました。
調査したところ、sedマニュアルのiオプションについてはこう書いてありました。
-i extension
Edit files in-place, saving backups with the specified extension.
If a zero-length extension is given, no backup will be saved. It
is not recommended to give a zero-length extension when in-place
editing files, as you risk corruption or partial content in situ-
ations where disk space is exhausted, etc.
Edit files in-place, saving backups with the specified extension.
If a zero-length extension is given, no backup will be saved. It
is not recommended to give a zero-length extension when in-place
editing files, as you risk corruption or partial content in situ-
ations where disk space is exhausted, etc.
どうやら、Mac環境でのsedコマンドでiオプションを使う場合は、拡張子の指定が必須らしいのです。
ただ、推奨はされていませんが、nullでも通りそうだったので、以下のように書き換えて実行してみました。
find . -type f -print0 | xargs -0 grep -l hoge | xargs -t -I{} sed -i “” ‘s#hoge#hogehoge#g’ “{}”;
無事置換できました!
他にも、「sed: RE error: illegal byte sequence」というエラーが出る場合は、
export LANG=C
と打てば無事置換できるようになります。
しかし、Macローカルで標準でUNIX系コマンドが使えるのはとても便利ですね。
今までエディタ経由でやっていた一括置換も、コマンドを使うほうが効率があがりそうです。
以上、虎澤でした。