system
虎澤 笑美

2018.8.3システム開発 

フロントエンドエンジニア

虎澤 笑美

さくらインターネット(レンタルサーバー)内でsed置換する

マリンロードスタッフブログをご覧いただいている皆様、こんにちは。
フロントエンドエンジニアの虎澤です。

以前、ブログにて、Macローカル環境でsed置換する際のコマンドについてご紹介いたしました。
Macローカルでsed置換すると「sed: 1: invalid command code R」になる時の対処方法

もう一度ご紹介しますが、Macローカルで一括置換を行うときのコマンドは以下のようになります。

# find . -type f -print0 | xargs -0 grep -l hoge | xargs -t -I{} sed -I “” ‘s#hoge#hogehoge#g’ “{}”;

さて、先日さくらインターネットのレンタルサーバー内にSSHログインして、パスの置換作業を行う機会がありました。
その際、上記のコマンドを流用して置換を行おうと思い、実行してみたところ、以下のようなエラーが返ってきてしまいました。

% find . -type f -print0 | xargs -0 grep -l hoge | xargs -t -I{} sed -i ‘s#hoge#hogehoge#g’ “{}”;
xargs: illegal option — I
usage: xargs [-0opt] [-E eofstr] [-I replstr [-R replacements] [-S replsize]]
 [-J replstr] [-L number] [-n number [-x]] [-P maxprocs]
 [-s size] [utility [argument …]]

同じコマンドなのになぜ通らないの!?と原因をいろいろと探っていると、本当に細かい仕様が違っているようでした。

①I{}の書き方
 BSDではIと{}の間にスペースが必要。MacローカルやLinux環境ではスペースは入れなくても処理は通る。

②sed -iの書き方
 BSDとMacローカルでは「sed -i “”」とかかなければダメ。Linuxでは「sed -i」でも処理は通る。

よって、さくらのレンタルサーバーでsed置換を行う際は、以下のようなコマンドになります。

% find . -type f -print0 | xargs -0 grep -l hoge | xargs -t -I {} sed -I “” ‘s#hoge#hogehoge#g’ “{}”;

環境によってコマンドの仕様は細かく違うようですね。
きっとxargsやsed以外にも仕様に違いのあるコマンドはたくさんあると思います。
Linuxで動いていたのにBSDじゃ動かない!ってときは、コマンドのマニュアルを確認して試行錯誤してみるしかないですね。

システム開発サービスはこちら
ページTOPへ