ワンライナーへの道(2日目)

はじめに

この記事は、ワンライナーマスターに向けてのエクササイズ記録です。

以下の書籍を用いて、1日1問解いて行きます。

1日1問、半年以内に習得 シェル・ワンライナー160本ノック (Software Design plusシリーズ) | 上田 隆一, 山田 泰宏, 田代 勝也, 中村 壮一, 今泉 光之, 上杉 尚史 |本 | 通販 | Amazon

2日目

事前にgawkをインストールしておくこと。

1.3.c grepによる検索と切り出し

$ echo 中村 山田 田代 上田 | grep -o "[^ ]田"
山田
上田

1.3.d awkによる検索と計算

$ seq 5 | awk '/[24]/'
2
4

$ seq 5 | awk '$1%2==0'
2
4

$ seq 5 | awk '$1%2==0{printf("%s 偶数\n", $1)}'
2 偶数
4 偶数

$ seq 5 | awk '$1%2==0{printf("%s 偶数\n", $1)} $1%2==1{printf("%s 奇数\n", $1)}'
1 奇数
2 偶数
3 奇数
4 偶数
5 奇数

$ seq 5 | awk 'BEGIN{a=0}$1%2==0{print $1, "偶数"}$1%2==1{print $1, "奇数"}{a+=$1}END{print "合計", a}'
1 奇数
2 偶数
3 奇数
4 偶数
5 奇数
合計 15

ワンライナーへの道(1日目)

はじめに

この記事は、ワンライナーマスターに向けてのエクササイズ記録です。

以下の書籍を用いて、1日1問解いて行きます。

1日1問、半年以内に習得 シェル・ワンライナー160本ノック (Software Design plusシリーズ) | 上田 隆一, 山田 泰宏, 田代 勝也, 中村 壮一, 今泉 光之, 上杉 尚史 |本 | 通販 | Amazon

1日目

1.2

$ man ls | grep -A 1 '^  *-a'
    -a, --all
          do not ignore entries starting with .

1.3.a sedによる置換

最初に見つけた文字列エをメに変換

$ echo クロロエチルエチルエーテル | sed 's/エ/メ/'
クロロメチルエチルエーテル

検索条件に合う文字列をすべて置換

$ echo クロロメチルメチルエーテル| sed 's/メ/エ/g'
クロロエチルエチルエーテル

検索条件に合う文字列を繰り返す

$ cho クロロエチルエーテル| sed 's/エチル/&&/'  # &は検索条件と同じ文字列を指す
クロロエチルエチルエーテル

検索条件に合う文字列の順序を変える

$ echo クロロメチルエチルエーテル| sed -E 's/(メチル)(エチル)/\2\1/'
クロロエチルメチルエーテル

$ echo クロロメチルエチルエーテル| sed -E 's/(メ..)(...)/\2\1/'
クロロエチルメチルエーテル

1.3.b grepによる検索

$ seq 100 | grep "0" | xargs
10 20 30 40 50 60 70 80 90 100

$ seq 100 | grep "^8" | xargs  # 行の先頭が8
8 80 81 82 83 84 85 86 87 88 89

$ seq 100 | grep "8$" | xargs  # 行末が8
8 18 28 38 48 58 68 78 88 98

$ seq 100 | grep "8." | xargs  # 8で始まり何か1文字
80 81 82 83 84 85 86 87 88 89

$ seq 100 | grep "^10*$" | xargs  # 行の先頭が1で0が0個以上
1 10 100

$ seq 100 | grep "[02468]$" | xargs  # 行末が0,2,4,6,8
2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 100

$ seq 100 | grep "[^02468]$" | xargs  # 行末が0,2,4,6,8以外
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99

$ seq 100 | grep -E "^(.)\1$" | xargs
11 22 33 44 55 66 77 88 99