Mac のターミナルで、UNIX コマンドを使って、複数のファイル中の文字列を一括で置換する方法のメモ。
BSD 系のコマンドを GNU 系に置き換える
Mac のコマンドは BSD 系だが、微妙に使いづらいので、Homebrew を使って GNU 系のコマンドに置き換える。Homebrew はあらかじめインストールしておく。
とりあえず GNU sed をインストールする。 (“/usr/local/bin” に入る)
$ brew install gnu-sed --default-names
他のコマンド (ls とか) も入れておく。
$ brew install coreutils
下記の位置に GNU 系のコマンド群が入った。ただし、コマンドの頭に “g” というプレフィックスが付いている。
$ brew --prefix coreutils
/usr/local/Cellar/coreutils/8.17
$ ls $(brew --prefix coreutils)/bin
g[ gcksum gdircolors gfmt glink gmv gpr gruncon gsleep gtee guname gwhoami
gbase64 gcomm gdirname gfold gln gnice gprintenv gseq gsort gtest gunexpand gyes
gbasename gcp gdu ggroups glogname gnl gprintf gsha1sum gsplit gtimeout guniq
gcat gcsplit gecho ghead gls gnohup gptx gsha224sum gstat gtouch gunlink
gchcon gcut genv ghostid gmd5sum gnproc gpwd gsha256sum gstty gtr guptime
gchgrp gdate gexpand gid gmkdir god greadlink gsha384sum gsum gtrue gusers
gchmod gdd gexpr ginstall gmkfifo gpaste grealpath gsha512sum gsync gtruncate gvdir
gchown gdf gfactor gjoin gmknod gpathchk grm gshred gtac gtsort gwc
gchroot gdir gfalse gkill gmktemp gpinky grmdir gshuf gtail gtty gwho
このプレフィックス無しのシンボリックリンクが次の位置に入っている。
$ ls $(brew --prefix coreutils)/libexec/gnubin
[ chroot df expr id md5sum nohup printf seq sleep tail tsort vdir
base64 cksum dir factor install mkdir nproc ptx sha1sum sort tee tty wc
basename comm dircolors false join mkfifo od pwd sha224sum split test uname who
cat cp dirname fmt kill mknod paste readlink sha256sum stat timeout unexpand whoami
chcon csplit du fold link mktemp pathchk realpath sha384sum stty touch uniq yes
chgrp cut echo groups ln mv pinky rm sha512sum sum tr unlink
chmod date env head logname nice pr rmdir shred sync true uptime
chown dd expand hostid ls nl printenv runcon shuf tac truncate users
ターミナルからコマンドを実行したときに GNU の方を呼ぶようにする。ついでに ls で色が付くようにしよう。
$ vi ~/.bash_profile
export PATH="$(brew --prefix coreutils)/libexec/gnubin:$PATH"
export PATH="/usr/local/bin:$PATH"
alias ll="ls -l --color=auto"
alias ls="ls --color=auto"
source ~/.bash_profile
複数ファイルを一括置換する
GNU sed が入ったら、あとは簡単に置換できる。
ある単一のファイル中の文字列を置換するなら、次のコマンドを使う。
$ sed -i 's/<置換対象の正規表現>/<置換後の文字列>/g' <ファイル名>
複数ファイルを置換する場合は、find と xargs と組み合わせて、次のようにすれば良い。
$ find <対象ディレクトリ> -name '<ファイル名のパターン>' | xargs sed -i 's/<置換対象の正規表現>/<置換後の文字列>/g'
コメント