ファイルの一部の文字列を差し替えするためのコマンド/パッケージ repin を作った

継続的ドキュメンテーション関連です。

README.mdなどのドキュメントを運用していると、そのドキュメントの一部を(CIなどで)自動で差し替えたいことがあります。

例えば xxx help コマンドの出力をもって機能一覧にしているようなREADMEだと、機能が追加されるたびに xxx help の実行結果でREADMEを差し替える必要があります。

ちょっと前に作った dirmap も出力結果をREADMEに貼っておきたい系のツールです。

k1low.hatenablog.com

そういう「文字列の差し替え」というのはsedでもある程度可能ですが、エスケープが難しかったり複数行の置換もなかなか覚えられないので専用ツールを書きました。

github.com

repin

例えば

# Hello

```console
```

みたいなMarkdownファイルがあったとして、$ echo hello world! という文字列を入れたいとき、GNU sedだと

$ cat README.md | sed -z 's/```console.*```/```console\n$ echo hello world!\n```/'

と書けば

# Hello

```console
$ echo hello world!
```

と出力されます。

これを repin で書くと

$ repin README.md -k '```console' -k '```' -r '$ echo hello world!'

となります。多少直感的になります。

また、置換文字列を標準入力で受け取れるので、

$ repin --help | repin README.md -k '```console' -k '```'

とすれば

# Hello

```console
repin is a tool to replace strings between keyword pair.

Usage:
  repin [FILE] [flags]

Flags:
  -h, --help              help for repin
  -i, --in-place          edit file in place
  -k, --keyword strings   keywords to use as a delimiter. If 1 keyword is specified, it will be used as the start and end delimiters; if 2 keywords are specified, they will be used as th\
e start and end delimiters, respectively.
  -N, --no-newline        disable appending newlines
      --raw-keywords      do not convert \n or \t of the entered keywords
  -r, --replace string    replace file path or string
  -v, --version           version for repin

```

と、複数行の help コマンドの出力を差し込んだMarkdownが得られます(これをGNU sedですることが私には難しかった)。

パッケージとしての利用

repinはパッケージとしての利用もできるようにしています*1

pkg.go.dev

というわけで

小さいコマンド/パッケージの紹介でした

*1:これは、 https://github.com/k1LoW/ndiag に組み込んでドキュメンテーション生成の仕組みをもう少しシンプルにしたいという思惑があるのですがまだ取りかかれていません