Amazonの長い長いURLを短縮するワンライナー（正規表現を勉強してみた）

### 背景

Amazonのページのリンクをコピペすると、こんな感じになる。長い！！🥺

- https://www.amazon.co.jp/現代思想2020年11月臨時増刊号-総特集◎鈴木大拙-生誕一五〇年-禅からZenへ-安藤礼二/dp/4791714059/ref=pd_sbs_14_17?_encoding=UTF8&pd_rd_i=4791714059&pd_rd_r=b966cd0a-1fe2-4369-9658-84aeab84587e&pd_rd_w=YGKRm&pd_rd_wg=2PInh&pf_rd_p=c295905f-82f9-4d73-8142-c393a4211258&pf_rd_r=49F2V3G2055H7WCDME84&psc=1&refRID=49F2V3G2055H7WCDME84


もっとひどい場合だと（上と同じもの）、めっちゃ長い！！！！😭

- https://www.amazon.co.jp/%E7%8F%BE%E4%BB%A3%E6%80%9D%E6%83%B32020%E5%B9%B411%E6%9C%88%E8%87%A8%E6%99%82%E5%A2%97%E5%88%8A%E5%8F%B7-%E7%B7%8F%E7%89%B9%E9%9B%86%E2%97%8E%E9%88%B4%E6%9C%A8%E5%A4%A7%E6%8B%99-%E7%94%9F%E8%AA%95%E4%B8%80%E4%BA%94%E3%80%87%E5%B9%B4-%E7%A6%85%E3%81%8B%E3%82%89Zen%E3%81%B8-%E5%AE%89%E8%97%A4%E7%A4%BC%E4%BA%8C/dp/4791714059/ref=pd_sbs_14_17?_encoding=UTF8&pd_rd_i=4791714059&pd_rd_r=b966cd0a-1fe2-4369-9658-84aeab84587e&pd_rd_w=YGKRm&pd_rd_wg=2PInh&pf_rd_p=c295905f-82f9-4d73-8142-c393a4211258&pf_rd_r=49F2V3G2055H7WCDME84&psc=1&refRID=49F2V3G2055H7WCDME84

本当は、これだけでよい😊（3つともクリックしてみてください。同じページに飛びます）

- https://www.amazon.co.jp/d/4791714059


不必要にURLが長いので、


- URLをメールやLINEで送るときに困る
- 自分の読書メモにURLを貼っておこうとおもったときに困る


AmazonのURLを短縮するサービスはいくつかあるみたいだけれど、仕組みは単純なので、正規表現も使ってみたい年頃だし、ワンライナーで書いてみた。


### 短縮の方針

[Amazonの商品ページURLをきれいにするロジックを考える][01]や[Amazon URL短縮ブックマークレット][02]にあるように、要は
`https://www.amazon.co.jp/d/番号/`
（番号は10桁の半角英数字、アルファベットは大文字のみ）とすればよい。

`sed`コマンドで短縮する。


### ワンライナー

下記コマンドで短縮できる。

```bash
$ sed -E 's/(https:\/\/[^/]+\/).+([0-9A_Z]{10}).+/\1d\/\2/'
```

じっさいには、（macOSの場合）URLを（クリップボードに）コピーし

```bash
$ pbpaste | sed -E 's/(https:\/\/[^/]+\/).+([0-9A_Z]{10}).+/\1d\/\2/'
```

上記URLをコピーして、上記`sed`をすると

```bash
$ pbpaste | sed -E 's/(https:\/\/[^/]+\/).+([0-9A_Z]{10}).+/\1d\/\2/'

https://www.amazon.co.jp/d/4791714059
```

しあわせだ……！


#### コマンドのなかみの解説

`pbpaste`はmacOSのシステムクリップボードから内容を取得している。これをパイプ（`|`）で'sed`コマンドにわたしている。

`sed`の`-E`オプションは、拡張正規表現。ざっくりといえば、各種記号を（ほとんど）エスケープしなくてよいので、目に優しく書きやすい。

`sed`での基本的な発想は

- `https://www.amazon〜/`を拾う（`\1`と名付けられる）
- `xxxxxxxxxx`という10桁の英数字を拾う（`\2`と名付けられる）
- `\1`と`\2`をくっつける


`https://〜`については、`www.amazon.co.jp`の場合と`www.amazon.com`の場合を想定。
`xxxxxxxxxx`については、10桁の半角英数字（アルファベットは大文字のみ）を想定。
（いずれも[Amazon URL短縮ブックマークレット][02]による）

`sed -E 's/(https:\/\/[^/]+\/).+([0-9A_Z]{10}).+/\1d\/\2/'`
を日本語訳すると
`sed -拡張正規表現をつかう '置換/2つの文字列を拾う/1こめと2こめをくっつける'`
となる。


#### `https://www.amazon〜/`を拾う

正規表現は`https:\/\/[^/]+\/`

- `\/`は、`/`はエスケープが必要のため。
- `[^/]`は、「/以外の文字」
- `[^/]+`で、「/以外の文字が1文字以上続く」

ということで、日本語訳すると「`https://`につづいて、`/`以外の文字が1文字以上続き、そのつぎに`/`となる」ものを探せ、となる。

マッチに対して`()`でくくると、`\1`などの名前で使えるようになる。カッコでくくったところまで表現すると

`(https:\/\/[^/]+\/)`


#### `xxxxxxxxxx`という10桁の英数字を拾う

正規表現は`[0-9A_Z]{10}`

- `[0-9]`で、「任意の半角数字1文字」
- `[A-Z]`で、「任意の半角英字1文字（大文字）」
- くっつけて、`[0-9A-Z]`で、「任意の半角英数字1文字（アルファベットは大文字）」
- `[0-9A-Z]{10}`で、「任意の半角英数字10文字（アルファベットは大文字）」

おなじく、マッチを`\2`でつかえるようにカッコでくくると

`([0-9A_Z]{10})`

#### 残りの部分

`(https:\/\/[^/]+\/).+([0-9A_Z]{10}).+`は、半分日本語訳にすると
`(https://アマゾン).+(半角英数字10文字).+`となる。

`.+`は「文字ならなんでもいい」ので、これで全体にマッチする。


#### `\1`と`\2`をくっつける

`sed`の後半部分（`s/検索/置換/`の`置換`部分）は
`\1d\/\2`

これは略。（`\1`と`\2`はマッチを意味して、`\/`は`/`をエスケープしている）


### おわりに

#### これをどう使うか

`pbpaste`を併用したワンライナーもじゅうぶん便利だけど、Alfred Workflowと組み合わせてつかいたい。Alfred Workflowの作成については、別記事で。


#### なぜURLが長いか

[Amazonの商品ページURLをきれいにするロジックを考える][01]にもあるとおり、Amazon側の都合によるのであって、ユーザ側にいいことがあるわけではない（アフィリエイトの人は別として）。


#### リソース

- [01.第1回　Amazonの商品ページURLをきれいにするロジックを考える][01]
- [02.Amazon URL短縮ブックマークレット][02]
- [03.sed コマンド - 基本正規表現と拡張正規表現][03]

[01]:https://shell-mag.com/rensai-shellscript1-1/2/
[02]:https://kosu.blog/2019/02/09/amazon-url-shortening/)
[03]:http://hydrocul.github.io/wiki/commands/sed.html#extended-regexp


#### 環境

- macOS BigSur 11.1
- MacBook Pro (13-inch, 2020, Four Thunderbolt 3 Ports)