この記事は何
shellgei160を通じて言語習得 Advent Calendar 2023に参加しています。
書籍「シェル芸ワンライナー160本ノック」の例題をRubyで解いてみて、Rubyの学習に役立てようとするものです。
例題はこちらのリポジトリで公開されているものに限ります。
https://github.com/shellgei/shellgei160
実行環境など
- Docker image: ruby:3.0.2
- 上記リポジトリをクローンした上で、リポジトリのルートディレクトリ直下に
answer-ruby
ディレクトリを作り、その中に解答となるファイルを作成していきます。
今回のテーマ
$ cat headings.md | sed -r 's/^## +(.*)/\1\n---/' | sed -r 's/^# +(.*)/\1\n===/'
以下のように文字列を置換する処理です。ポイントはマッチした文字列の一部を使って、置換後の文字列を作成する点です。
(変換前)
## subset
(変換後)
subset
---
解
text = File.open('qdata/10/headings.md', 'r').read
text.gsub!(/^## +(.*)/, "\\1\n---")
text.gsub!(/^# +(.*)/, "\\1\n===")
puts text
所感・メモ
-
( )
で囲ったブロック(?)を置換後文字列の中で使うには\1
(複数あれば\2
, ...)を使う。\n
を入れるので、置換後文字列はダブルクオーテーションにしておく。\1
はエスケープが必要なので\\1
。