この記事は何
shellgei160を通じて言語習得 Advent Calendar 2023に参加しています。
書籍「シェル芸ワンライナー160本ノック」の例題をRubyで解いてみて、Rubyの学習に役立てようとするものです。
例題はこちらのリポジトリで公開されているものに限ります。
https://github.com/shellgei/shellgei160
実行環境など
- Docker image: ruby:3.0.2
- 上記リポジトリをクローンした上で、リポジトリのルートディレクトリ直下に
answer-ruby
ディレクトリを作り、その中に解答となるファイルを作成していきます。
今回のテーマ
$ cat gijiroku.txt | xargs -n2 | sed 's/^すず/鈴木/;s/^さと/佐藤/;s/^やま/山田/;s/ /:/;s/$/\n/'
gijiroku.txt
中にある、改行区切りで人\n発言\n
となっている文章を人:発言\n
となるように置換しつつ、人の愛称を苗字に直す処理です。
解
replacements = {
/^すず/ => '鈴木',
/^さと/ => '佐藤',
/^やま/ => '山田'
}
# xargs -n2 相当のことをやるのって意外と大変
lines = File.open('qdata/11/gijiroku.txt', 'r').readlines
.map(&:chomp)
.reject(&:empty?)
pairs = lines.each_slice(2).to_a
# ここまで
# あとは置換やらなんやら
text = pairs.map { |pair| pair.join(':') }.join("\n\n")
replacements.each { |k, v| text.gsub!(k, v) }
puts text
所感
-
xargs -n2
相当のことをやるには、空行を無視して、それ以外の行を二行で一組になるように扱う必要があった。意外と面倒。array.each_slice(n).to_a
は覚えておこう。