Alfredのワークフローなどで、スクリプトにzshをはじめました。初心者用にメモを残します
やりたいこと
価格コムの検索(検索結果URLを組み立てる)
と、書いてもなんだかわからないでしょう。alfredのワークフローの習作として試したものです
シェルスクリプトのエッセンスをこの記事に残しておきます
まず、こちらを見てください
価格コム人気検索ワード
現在「定番の人気キーワード」の1位は、「スマートウォッチ 血圧」となっています
さらにクリックしてみましょう(執筆当時)
そのキーワードでの検索結果が表示されますがURLをみると
https://kakaku.com/search_results/%83X%83%7d%81%5b%83g%83E%83H%83b%83%60+%8C%8C%88%B3/
となっています
よくURLを見る人はピンとくるかもしれません
%ほにゃほにゃは、日本語をコード化したものです
先頭のhttps://kakaku.com/search_results/
というのは、その名称から検索結果のURLと推測できます
ということは、価格コムのトップページの検索ボックスを使わなくても、URLの指定で検索ができそうですね
そこで、ソースコーディングでURLを組み立てる!という欲求が生まれるのです
初めに書いたやりたいことというのは、ひらべったくいうと
「スマートウォッチ 血圧」という入力から、
https://kakaku.com/search_results/%83X%83%7d%81%5b%83g%83E%83H%83b%83%60+%8C%8C%88%B3/
というURLにアクセスするとコードを作るということです
エンコードの内容を確認する
まず、文字コードといってもいくつかの規格があるので、%ほにゃほにゃが、どのコードなのか特定しましょう
インターネット上には、貼り付けるだけでデコードしてくれるツールがあるので色々試してみてください
ちなみに、日本語(文字)を文字コードに変換することをエンコード、
文字コードを日本語(文字)に復元することをデコードといいます
結局s-jisのようですね
コード変換を行う(nkf、tr、sed)
シェルスクリプトでコード変換を行うのはnkfコマンドです
私のmacにはnkfコマンドが入っていなかったのでインストールを実施しました
こちらも、やりかたはインターネットでいくつも公開されていますので参考にしてください
では実験です
echo 'スマートウォッチ 血圧' | nkf -WsMQ
#=> =83X=83=7D=81=5B=83g=83E=83H=83b=83=60=81=40=8C=8C=88=B3
イコール区切りなので、%に変換させましょう。trコマンドです
echo 'スマートウォッチ 血圧' | nkf -WsMQ | tr = %
#=> %83X%83%7D%81%5B%83g%83E%83H%83b%83%60%81%40%8C%8C%88%B3
URLのエンコード部分と比べると、違いがあります
%83X%83%7D%81%5B%83g%83E%83H%83b%83%60%81%40%8C%8C%88%B3
%83X%83%7d%81%5b%83g%83E%83H%83b%83%60+%8C%8C%88%B3
検索キーワードの区切りである全角スペースが、nkfでは%81%40というコードですが、
URLでは"+"となっています
こちらも置換しましょう。複数文字パターンの置換なのでsedを使います
echo 'スマートウォッチ 血圧' | nkf -WsMQ | tr = % | sed s/%81%40/+/g
#=> %83X%83%7D%81%5B%83g%83E%83H%83b%83%60+%8C%8C%88%B3
これで良さそうですね
どうでもいいのですけど、trとsedの2つの置換を、1つのsedにまとめてみました。
-eオプションを使います
1つ目の変換パラメータの前にも-eオプションをつける必要がありますのでご注意を
echo 'スマートウォッチ 血圧' | nkf -WsMQ | sed -e 's/=/%/g' -e 's/%81%40/+/g'
#=> %83X%83%7D%81%5B%83g%83E%83H%83b%83%60+%8C%8C%88%B3
キーボード入力を行う
キーボードからの入力はreadで可能です。echoと併せて入力のプロンプトができます
echo '入力してください'; read kw; echo '入力文字:'$kw
#=> 入力してください
#=> スマートウォッチ 血圧
#=> 入力文字:スマートウォッチ 血圧
URLにアクセスする
URLへのアクセスはopenコマンドを使います
エンコード部分はURL固定部分の後に、echoで出力して連結しています
こちらができあがりです
echo '価格コムの検索キーワードを入力してね'; read kw; open "https://kakaku.com/search_results/"`echo $kw | nkf -WsMQ | sed -e 's/=/%/g' -e 's/%81%40/+/g'`;
雑談
検索文字が長いとnfkで整形されてしまうようです
上記の価格コムの場合だと、URLがエラーとなってしまいます
いまのところ対処がわかりません
echo '12345678901234567890' | nkf -WsMQ | sed -e 's/=/%/g' -e 's/%81%40/+/g'
#=> %82P%82Q%82R%82S%82T%82U%82V%82W%82X%82O%82P%82Q%82R%82S%82T%82U%82V%82W%
#=> %82X%82O
fオプションで指定できるようですが、デフォルトが最大のようです
# fオプションを10にした場合
echo '12345678901234567890' | nkf -f10 -WsMQ | sed -e 's/=/%/g' -e 's/%81%40/+/g'
#=> %82P%82Q%82R%82S%82T
#=> %82U%82V%82W%82X%82O
#=> %82P%82Q%82R%82S%82T
#=> %82U%82V%82W%82X%82O
# fオプションを60にした場合(デフォルト)
echo '12345678901234567890' | nkf -f60 -WsMQ | sed -e 's/=/%/g' -e 's/%81%40/+/g'
#=> %82P%82Q%82R%82S%82T%82U%82V%82W%82X%82O%82P%82Q%82R%82S%82T%82U%82V%82W%
#=> %82X%82O
# fオプションを100にした場合
echo '12345678901234567890' | nkf -f100 -WsMQ | sed -e 's/=/%/g' -e 's/%81%40/+/g'
#=> %82P%82Q%82R%82S%82T%82U%82V%82W%82X%82O%82P%82Q%82R%82S%82T%82U%82V%82W%
#=> %82X%82O