日々是好日

プログラミングについてのあれこれ、ムダ知識など

Node.js でシェルコマンド

VSCode拡張機能でシェルコマンドを書いたので( ..)φメモメモ

VSCode の画面を構成するworkbench.main.cssが超長かったので、 文字列をプログラム中で取得せずに編集できないか検討してみた。

やること

特定のファイルに書き込まれた文字列をシェルコマンドで編集する。

超長い文字列が含まれるファイルの操作に使えるかもしれない。

環境と使うパッケージ

  • 環境
    • Node.js
    • TypeScript
  • 使うパッケージ
    • child-process

child-process パッケージの exec メソッドで、シェルコマンドの実行が可能。

実装

/*ext-hoge-start*//*ext-hoge-end*/で囲まれた部分を置換する。

ポイントとしては、

  • cat ${path}で文字列を取得し、sedにパイプする。
  • -iオプションにより、sed ... > ${path}としなくても上書き保存ができる。
import * as cp from 'child-process';
...

//対象のテキストファイル
const path = './hoge.txt';

const hoge = 'hoge';

//検知する文字列
//「*」はバックスラッシュ2つでエスケープ
const target = `/\\*ext-${hoge}-start\\*/.*/\\*ext-${hoge}-end\\*/`;

//exec でシェルコマンドを実行
//target でマッチした部分を fuga に置換する
cp.exec(`cat ${path} | sed -i -e "s|${target}|fuga|" ${path}`, (err, stdout, stderr) => {
  if (err) {
    console.log(err);
  } else {
    console.log(stdout);
  }
});

実行するとこんな感じになる。

# コマンド実行前
$ cat ./hoge.txt
foo
bar
/*ext-hoge-start*/hoge/*ext-hoge-end*/

# コマンド実行後
$ cat ./hoge.txt
foo
bar
fuga

参考

developer.mozilla.org

nodejs.org

it-ojisan.tokyo

open-groove.net

qiita.com