LoginSignup
0
0

Ruby芸160チャレンジ(#11)複数行テキストを一塊として扱う

Posted at

この記事は何

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は覚えておこう。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0