かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

Mac ファイルコピーする時にゴニョゴニョ変更したい

チーム作業してると開発が進むにつれて追加や変更が頻発する環境変数の扱いが悩ましいです。
.env.sample のようなキーだけ書かれたファイルを git 管理することが多いのですが、これをリネームする際にファイルに書かれている内容をゴニョゴニョしたい事があったのでメモ

CONS cp でコピーはコピーするだけ

$ cp .env.sample .env

.env.sample.env というファイル名でコピー。コピーなので内容の変更はできない

sed でファイルの中身を変更したり削除したりできる

sed -e 処理内容 でファイルの変更ができ、-e 区切りで処理を連続して行うことができる

  • sed -e 's/xxx/ZZZ/g' ... xxx を全て ZZZ に置き換える
  • sed -e 1,3d … 1行目〜3行目までを削除
  • sed -e 's/xxx/ZZZ/g' -e '/^$/dxxx を全て ZZZ に置き換えて、空行を削除する

e.g.

下記のような .env.sample があり、1〜2行目を削除して http://localhost:4000https://my-api.com に置換、空行を削除して .env として出力したい

# コメントです

HOST=http://localhost:3000
API=http://localhost:4000
API_FOR_ADMIN=http://localhost:4000/admin

# Token を取得して設定してください

SECRET_TOKEN=

👇

$ cat .env.sample | sed -e 1,2d -e 's/http:\/\/localhost:4000/https:\/\/my-api.com/g' -e '/^$/d' > .env

👇 .env

HOST=http://localhost:3000
API=https://my-api.com
API_FOR_ADMIN=https://my-api.com/admin
# Token を取得して設定してください
SECRET_TOKEN=

₍ ᐢ. ̫ .ᐢ ₎ すごい!

📝 sed での空白行とコメント行の削除

よく使いそうなので

  • 空白行の削除 … sed -e '/^\s*$/d'
  • # から始まるコメント行の削除 … sed -e '/^\s*#/d'

空白行とコメント行をまとめて削除

$ sed -e '/^\s*$/d' -e '/^\s*#/d'

正規表現は自信がないけど

  • 空白行の削除 /^\s*$/d^\s* は先頭に空白がいくらあってもで $ が行末なので、空白だけの行にマッチ。最後の dsed の削除コマンド
  • コメント行の削除 /^\s*#/d^\s* で行頭のスペースを許容して # なので # から始まるコメント行にマッチ。最後の dsed の削除コマンド

grep -v を使ってもコメント行を削除できる

  • grep -v … マッチした箇所を除外

e.g. .env.sample# から始まるコメント行と空白行を削除して .env として出力

$ cat .env.sample | grep -v -e '^\s*#' -e '^\s*$' > .env

₍ ᐢ. ̫ .ᐢ ₎👌

grepsed| (パイプ) で連結できる

e.g.
下記 .env.sample のコメント行と空白行を削除して http://localhost:4000https://my-api.com に置換したい

# env.sample
# コメントです

HOST=http://localhost:3000
API=http://localhost:4000
API_FOR_ADMIN=http://localhost:4000/admin

# Token を取得して設定してください

SECRET_TOKEN=
  

👇 grep でコメント行と空白行を削除して sed で置換する

$ cat .env.sample | grep -v -e '^\s*#' -e '^\s*$' | sed -e 's/http:\/\/localhost:4000/https:\/\/my-api.com/g' > .env

👇 .env

HOST=http://localhost:3000
API=https://my-api.com
API_FOR_ADMIN=https://my-api.com/admin
SECRET_TOKEN=

₍ ᐢ. ̫ .ᐢ ₎👌

完 全
理 解


[参考]