シェル芸160本ノック解答例 その9

技術評論社から出版された『1日1問、半年以内に習得 シェル・ワンライナー160本ノック』の解答例です。


問題81

$ perl -C -lnE 's/^\x{FEFF}/[BOM]/;say' bom.txt
[BOM]ボムボムプリンおいしい
$ perl -C -lnE 's/^\x{FEFF}/[BOM]/;say' nobom.txt
ボムボムプリン完売

問題82

$ split -b1000 --numeric-suffixes=1 image.bmp image.bmp.

# 確認
$ ls -al image.bmp.??
-rw-r--r-- 1 mitsuhisa mitsuhisa 1000 11月  5 18:00 image.bmp.01
-rw-r--r-- 1 mitsuhisa mitsuhisa 1000 11月  5 18:00 image.bmp.02
-rw-r--r-- 1 mitsuhisa mitsuhisa 1000 11月  5 18:00 image.bmp.03
-rw-r--r-- 1 mitsuhisa mitsuhisa 1000 11月  5 18:00 image.bmp.04
-rw-r--r-- 1 mitsuhisa mitsuhisa 1000 11月  5 18:00 image.bmp.05
-rw-r--r-- 1 mitsuhisa mitsuhisa 1000 11月  5 18:00 image.bmp.06
-rw-r--r-- 1 mitsuhisa mitsuhisa 1000 11月  5 18:00 image.bmp.07
-rw-r--r-- 1 mitsuhisa mitsuhisa 1000 11月  5 18:00 image.bmp.08
-rw-r--r-- 1 mitsuhisa mitsuhisa 1000 11月  5 18:00 image.bmp.09
-rw-r--r-- 1 mitsuhisa mitsuhisa 1000 11月  5 18:00 image.bmp.10
-rw-r--r-- 1 mitsuhisa mitsuhisa 1000 11月  5 18:00 image.bmp.11
-rw-r--r-- 1 mitsuhisa mitsuhisa 1000 11月  5 18:00 image.bmp.12
-rw-r--r-- 1 mitsuhisa mitsuhisa  426 11月  5 18:00 image.bmp.13

問題83

$ sed 's/[\x5C]/\\&/g' soleil.bash > new_soleil.bash
$ bash ./new_soleil.bash | iconv -f SJIS -t UTF-8
親戚のソレイユちゃんは表情が豊かで可愛い女の子。

問題84

$ zcat newline.txt.gz | perl -0777 -nE '$l=()=/[^\r]\n/g;$c=()=/\r\n/g;say "LF $l\nCRLF $c"'
LF 8
CRLF 8

問題85

$ echo 🍑 🍓 | ruby -ane 'puts [($F[0].ord+$F[1].ord)/2].pack("U")'
🍒

問題86

$ uconv -x 'NFKD;ASCII' fractions | tr ' ' + | gp -fq
131/72

問題87

$ sed -E 's/[0-9]{7} ?//g;s/ /\n/g;1s/^/obase=16;ibase=8;/' oct.txt | bc | sed -E 's/^/0/;/.{5}/s/0//;s/(..)(..)/\2\1/' | xxd -p -r
秒速で10円稼ぐ秘密

問題88

$ cat image_masked.bmp | od -An -tx1 -v -w3 | tail -n$((64*64)) | ruby -ane 'BEGIN{b=""};b<<$F[0].to_i(16).to_s(2).slice(-1);END{puts b.to_i(2).to_s(16)}' | xxd -p -r
Hello, 私だ。
以下は私の個人情報だ!!
絶対に漏らすなよ!!!

銀行口座の暗証番号: 6553
クレジットカードの暗証番号: 1145
電話番号: 123-1111-2222
ラッキーナンバー: 8931
好きな食べ物: 豚塩豚テキ定食
好きなスナック: ポテトチップス
行きつけのスナック:
  店名: スナック 結
  ママ: ユイ
  人生: 両親富豪->高等学校退学->結婚出産->旦那浮気
座右の銘: 安全第一
口癖: めちょっく

問題89

$ base64 -d ctf-data | gunzip > ctf.o && objdump -j .rodata -s ctf.o | sed '1,/:$/d;s/ ...0//' | grep -Po [0-9a-f]{2} | awk '/^[^01]/{printf "%02x",strtonum("0x" $1)-($1=="20"?0:2)}' | xxd -p -r
FLAG is shell-gei

問題90

$ printf '0x%x\n' $((4#12+8#34+16#56))
0x78

# `ruby`を使った別解
$ ruby -e 'puts "0x"+("12".to_i(4)+"34".to_i(8)+"56".to_i(16)).to_s(16)'
0x78
Written on November 11, 2022