jus共催 第40回光明⭐️節シェル芸勉強会(大阪会場)に参加しました。
問題と解答は上田先生のブログを見て頂くとして、shell芸初心者がセッションの中で気づいたことをまとめます。
※初心者の感想なので、初級者以上の方は参考にならないと思います。
w3mはUbuntu18.04のデフォルトではインストールされていない?
いきなりの試練でw3mが動きません。よく見たらインストールされていませんでした。
$ w3m -dump https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%9B%E3%82%A6%E3%83%89%E3%83%AA
Command 'w3m' not found, but can be installed with:
sudo apt install w3m
$ sudo -E apt-get install -y w3m
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
提案パッケージ:
cmigemo dict dict-wn dictd libsixel-bin mpv w3m-el w3m-img xdg-utils xsel
以下のパッケージが新たにインストールされます:
w3m
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 0 個。
924 kB 中 0 B のアーカイブを取得する必要があります。
この操作後に追加で 2,568 kB のディスク容量が消費されます。
以前に未選択のパッケージ w3m を選択しています。
(データベースを読み込んでいます ... 現在 54587 個のファイルとディレクトリがインストールされています。)
.../w3m_0.5.3-36build1_amd64.deb を展開する準備をしています ...
w3m (0.5.3-36build1) を展開しています...
mime-support (3.60ubuntu1) のトリガを処理しています ...
w3m (0.5.3-36build1) を設定しています ...
man-db (2.8.3-2ubuntu0.1) のトリガを処理しています ...
$
基本中の基本、Loop処理
結構使うんですが以下のパターン以外は、色々出来ることは知りながら使えていなかったので、よりよく理解できました。
$ for item in `ls ./` ; do
> rm -v ${item}
> done
連番振るとか
$ for item in {1..6}; do echo $item;done
1
2
3
4
5
6
これでもいいですね。
$ seq 1 6 |while read c ;do echo AAAA $c BBBB ;done
AAAA 1 BBBB
AAAA 2 BBBB
AAAA 3 BBBB
AAAA 4 BBBB
AAAA 5 BBBB
AAAA 6 BBBB
$
特定の文字も羅列すればOK
$ for item in 山田 田中 鈴木; do echo $item;done
山田
田中
鈴木
$ for item in 山田 田中 鈴木; do echo $item;done
山田 田中 鈴木
※漢字のスペースはデリミターにはなりませんね。
こんなパターンも
$ for item in 山田{一郎,次郎,三郎} 鈴木一郎 ; do
> echo ${item}
> done
山田一郎
山田次郎
山田三郎
鈴木一郎
$
次の例はちょっと表示行数が多いので折りたたんであります。
for item in {z..A}; do echo $item
$ for item in {z..A}; do echo $item;done
z
y
x
w
v
u
t
s
r
q
p
o
n
m
l
k
j
i
h
g
f
e
d
c
b
a
`
_
^
]
[
Z
Y
X
W
V
U
T
S
R
Q
P
O
N
M
L
K
J
I
H
G
F
E
D
C
B
A
$
日付を色々なぶる
適当な範囲の日付を取得する。
※あり得ない日付は/dev/nullに捨てることで正しい日付だけ取得できる。
$ seq 20200130 20200301|date -f- "+%m/%d" 2> /dev/null
01/30
01/31
02/01
02/02
02/03
...
02/27
02/28
02/29
03/01
$
こんなやり方もあります。
"+%EY%m月%d日(%a)"
は和暦+曜日表示です。
曜日は正しく表示されていますね。
2019/05/01以降は新元号になりますが、/usr/share/i18n/locales/ja_JP
に元号の文字列と開始日を持っているので追加が必要になります。
※誰も騒いでいないようですが、現在調査中です。apt-get update
で直っちゃうんでしょうか?
$ seq -f '1/1 %g day' 360 366 | LC_TIME=ja_JP.utf8 date -f- "+%EY%m月%d日(%a)"|tail
平成31年12月27日(金)
平成31年12月28日(土)
平成31年12月29日(日)
平成31年12月30日(月)
平成31年12月31日(火)
平成32年01月01日(水)
平成32年01月02日(木)
$
Unicode正規化について
(ユニコードせいきか、英語: Unicode normalization)とは、等価な文字や文字の並びを統一的な内部表現に変換することでテキストの比較を容易にする、テキスト正規化処理の一種である。
よく分かっていませんが、なんかあるようです。
$ echo -n 'が㍻㍼㌶' | perl -MUnicode::Normalize -C -ne 'print NFKC($_)'| iconv -f utf-8 -t utf-16be |xxd -p -u | fold -4|while read c;do echo -e "$c $s \u$c"; done
304C が
5E73 平
6210 成
662D 昭
548C 和
30D8 ヘ
30AF ク
30BF タ
30FC ー
30EB ル
こんな感じに正規化されるみたいです。
echo -n 'が㍻㍼㌶'
改行無しで標準出力へ
perl -MUnicode::Normalize
Unicode正規化
xxd -p -u
16 進ダンプを作成する。
-p
ポストスクリプト形式の 16 進ダンプを出力する。別名 プレーン 16 進ダンプ。
-u
16 進数の表記に大文字を使います。指定がない場合は小文字で出力されます。
NFKC($_)
→NFD($_)
にすると展開が変わります。
$ echo -n 'が㍻㍼㌶' | perl -MUnicode::Normalize -C -ne 'print NFD($_)'| iconv -f utf-8 -t utf-16be |xxd -p -u | fold -4|while read c;do echo -e "$c $s \u$c"; done
304B か
3099 ゙
337B ㍻
337C ㍼
3336 ㌶