シェル芸勉強会をやっていることをたまたま気がついたので未登録でしたが見てました。
シェル芸は、基本 GNU コマンドで行うため、macOS の BSD 系だと回答をみてもそのまま動かすことができません。
macOS で試す場合は、 brew
で基本的なコマンドと、シェル芸でよく使われる awk
sed
を入れる必要がありました。
brew install coreutils brew install gawk brew install gnu-sed
Q1
## Q1
— 上田 隆一 (@ryuichiueda) April 25, 2020
次の`nums`ファイルについて、
```
$ cat nums
1, 3-5, 8, 10, 13-18, 20
```
次のようにハイフンで省略されている数字を復元してください。
```
1, 3, 4, 5, 8, 10, 13, 14, 15, 16, 17, 18, 20
```#シェル芸
echo
コマンド にて、中括弧でくくった数字をドットでつなぐと連続された数字に展開されるようです。
$ echo {3..10} 3 4 5 6 7 8 9 10
まず、この基本的なことすら知りませんでした。
これを知っていれば、あとは -
を ..
に展開して、
$ echo "1, 3-5, 8, 10, 13-18, 20" | gsed -r 's/-/../' 1, 3..5, 8, 10, 13-18, 20
-
ハイフンの前の数字を正規表現 [0-9]+
で抜き出して
$ echo "1, 3-5, 8, 10, 13-18, 20" | gsed -r 's/([0-9]+)-/../' 1, ..5, 8, 10, 13-18, 20
-
ハイフンの後ろの数字も正規表現 [0-9]+
で抜き出して、2箇所置換しているので g
をつけて
$ echo "1, 3-5, 8, 10, 13-18, 20" | gsed -r 's/([0-9]+)-([0-9]+)/../g' 1, .., 8, 10, .., 20
中括弧をつけるようにして
$ echo "1, 3-5, 8, 10, 13-18, 20" | gsed -r 's/([0-9]+)-([0-9]+)/{..}/g' 1, {..}, 8, 10, {..}, 20
置換もとの数字も表示できるようにして
echo "1, 3-5, 8, 10, 13-18, 20" | gsed -r 's/([0-9]+)-([0-9]+)/{\1..\2}/g' 1, {3..5}, 8, 10, {13..18}, 20
準備ができたので、頭に echo
コマンドつけて
$ echo "1, 3-5, 8, 10, 13-18, 20" | gsed -r 's/([0-9]+)-([0-9]+)/{\1..\2}/g' | gsed -r 's/^/echo /' echo 1, {3..5}, 8, 10, {13..18}, 20
bash
にわたすと出来上がり。
$ echo "1, 3-5, 8, 10, 13-18, 20" | gsed -r 's/([0-9]+)-([0-9]+)/{\1..\2}/g' | gsed -r 's/^/echo /' | bash 1, 3, 4, 5, 8, 10, 13, 14, 15, 16, 17, 18, 20
こういったことを丁寧に解説してくれるのでとても勉強になりました。
sed
や awk
を使ってても雰囲気で使ってることを思い知らされた。
awk
コマンドは簡単なことしか知らないので、オプションや使い方を学ぶことができそうです。
正規表現はある程度知ってることが前提なので、そこは別途勉強が入りそう。
「先週に引き続き土曜の昼から勉強会見ているのはいかがなものか」と家族に怒られてしまったので途中で離脱... YouTube Live はアーカイブされてます。 後半の Unicode は生で見たかったな。