Mac のターミナルで複数ファイルの文字列を一括置換する

スポンサーリンク

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'

コメント

タイトルとURLをコピーしました