Powershellの正規表現で桁数固定の文字列にマッチさせたいとき

とても基本的なことなのだが、ちょっとはまってしまったのでメモ。

Powershell正規表現で桁数固定の文字列にマッチさせたいとき、ちゃんと数値の前後の文字列もパターンに含めないと意図しない文字列にもマッチしてしまう

例えば、「test.NNN」(Nは0-9の数字)というパターンにマッチさせたいとき、

PS D:\> #これでいいかなーと思いきや
PS D:\> "test.005" -match "test.\d{3}"
True
PS D:\> #これもマッチしてしまう
PS D:\> "test.0005" -match "test.\d{3}"
True
PS D:\> "test.005.txt" -match "test.\d{3}"
True

防止するためには桁数指定をするときには必ず前後の文字列もパターンに加えるようにする

PS D:\> #不要なものをマッチさせないためには終端を示すメタキャラクタ($)を追加する
PS D:\> "test.0005" -match "test.\d{3}$"
False
PS D:\> "test.005.txt" -match "test.\d{3}$"
False
PS D:\> "test.005" -match "test.\d{3}$"
True

しょうもないんだけど小一時間ぐらい悩んでしまった。 ちゃんと睡眠をとった上で作業しよう。

Powershellで指定した行数でファイルを分割する

例えばカレントディレクトリのtest.txtを3行ごとにtest[N].txtに分割するときは以下のように書く(は任意の0以上の整数)

$i=0; cat .\test.txt -ReadCount 3 | % { $_ > test$i.txt;$i++ }

cat(=Get-Content)のReadCountオプションで3行ずつパイプラインに渡してファイルに出力している


なお、上記のようにすっきりかけるようになるまでには以下のような変遷を経てる

一番最初

良く分からないのでファイルをエディタで開いたときの行番号表示から、ファイル数を別途計算し、その上でマジックナンバーを多用しつつGet-Contentの行数指定で愚直に切り出す。

0..3 | %{ (cat .\test.txt)[($_ * 3)..($_ * 3 +2)] > test$_.txt}

行数ぐらいPowershellで計算できるだろと思い至り、$lines行づつ分けたときのファイル数をまず出してからGet-Contentを使って毎度指定行を読み込んでファイル出力してる

$lines = 3
$maxCount=[Math]::Ceiling($(cat .\test.txt | measure).count / $lines) - 1 
0..$maxCount | %{ (cat .\test.txt)[($_ * $lines)..($_ *$lines +2)] > test$_.txt}

ReadCountオプションは便利ですね。

PowershellでWunderListのAPIを触ってみる(新刊.netのRSS Feedを利用して本をWunderListに登録する)

環境

Invoke-RestMethod と ConvertTo-Json が必要なのでPowershell v3.0以降で動くはず

前準備

Authorization | Wunderlist Developerに従って以下のことをしておく

  1. WunderListへのアプリケーションの登録
  2. Web Server Application Integrationに従って、アカウントの認証設定のうえ、codeを入手しておく

実際にやってみる

今回は新刊.netrssフィードを利用して、ほしい本(とその著者)をWunderListのInboxに投入する。 ConfigとBookList Feedには環境に応じた値を入れること。

# Config
$conf=@{client_id = "CLIENT ID"; client_secret = "SECRET"; code = "CODE"}
$list_id=ID # Inbox id (integer) 

# Object to convert to json for create task api
$task=@{list_id = $list_id ; title = "";}

# BookList Feed
$source = "http://sinkan.net/?action_rss=true&uid=12345&mode=schedule&key=hogehoge";

# Get access token
$headers = @{"X-Access-Token"=""; "X-Client-ID"=$conf.client_id; "Content-Type"="application/json" }
$body = $conf | ConvertTo-Json
$headers.'X-Access-Token' = $(Invoke-RestMethod -Method Post -Uri "https://www.wunderlist.com/oauth/access_token" -Body $body -Headers $headers).access_token

#Get NewBookList and Create tasks into Inbox
Invoke-RestMethod $source | % { 
    $task.title = $($_.title.'#cdata-section' +  "/" + $_.creator.'#cdata-section') ; $task } | % {
      ConvertTo-Json $_ } | % {
        $body=[System.Text.Encoding]::UTF8.GetBytes($_); $_ } | % { 
          Invoke-RestMethod -method POST -Uri "a.wunderlist.com/api/v1/tasks" -Headers $headers -Body $body } 

メモ

  • 自分ひとりで使うなら、登録時のアプリのURLやリダイレクトURLはテキトーで良い。
  • リクエストのヘッダの仕様などはAuthorization | Wunderlist Developer参照
  • Invoke-RestMethodさえ使えればあまり難しくはない、かと思いきや日本語の書名が文字化けしてとても苦労した。結局、せっかくだからおれはこのInvoke-RestMethodをつかうぜ | たっぷす庵を参考にさせてもらって、JSONごとByte配列にしてリクエストに突っ込んだがもっとうまい方法はあると思う。
  • JSONをByteにするところで、パイプの入力オブジェクトを出力しているのは、後続のパイプでもともとの入力だった$taskの数だけ後続の処理をするため。これをしないとByte配列の要素数分、後続のパイプの処理が実行されてしまう。
  • 上記のコードはAPIを呼び出す部分と、API用のパラメータを作る部分に関数なりで分割した方がきれいなのだと思うが、かき捨てのコードなのでそこまでしてはいない
  • はじめて認証付きのAPIを触ったのだが、意外と簡単だった。
  • パイプを多用したので、ErrorActionをうまく使ってtry-catchなりtrapしてやらないとエラーが拾えなさそう。
  • list_idは以下のようなAPIで取得できる
Invoke-RestMethod -method GET -uri "a.wunderlist.com/api/v1/lists" -Headers $headers

Windowsでオープン拡張辞書を利用して改行を含む文字列を辞書登録する

WindowsIMEに複数行の文字列を登録したい場合は、オープン拡張辞書を作成する。 Microsoftから配布されているオープン拡張辞書を作成するためのエクセルファイルを利用して作成できる。 ただし、一部制限事項はあるので注意が必要。

ダウンロードとインストール

  1. Download Microsoft Office IME 2010 オープン拡張辞書作成用 Excel テンプレート from Official Microsoft Download Centerからテンプレートをダウンロードする
  2. ダウンロードしたファイル内のsetup.exeを実行し必要なツールをインストールする

使い方

  1. ダウンロードしたファイル内のIME Open Extended Dictionary Builder.xltxを開く
  2. 画面右の作業タブで入力中によみを自動入力のチェックをはずす
  3. 内容を記入する([変換後の文字列]にALT+ENTERで改行入力できる)
  4. 画面右の作業タブで辞書の作成ボタンを押す

注意点

  1. [変換後の文字列]には字数制限があるようで、長い言葉は登録できなかった
  2. [変換後の文字列]内の改行はCRとなるので、メモ帳では反映されない
  3. Windows10ではOfficeIMEを導入できないので、辞書生成前のエラーチェックができない(実際に辞書を作ってから取り込んでみるしかない)
  4. こちらによると[変換後の文字列]に;(セミコロン) を2回使用することはできないようだ

その他

ユーザー提供のオープン拡張辞書:TechNetフォーラム内にあるユーザーが作成したオープン拡張辞書公開のためのページ

Download Microsoft Office IME 2010 オープン拡張辞書作成用 Excel テンプレート from Official Microsoft Download Center:Microsoftダウンロードセンターで公開されているオープン拡張辞書を作成するためのExcelテンプレート

Microsoft Office IME 2010 オープン拡張辞書 | Microsoft Office IME 2010 | Microsoft Office 2010:Microsoftによるオープン拡張辞書の概要

辞書登録で複数行(改行)の入力をしたい! - gooブログはじめました!

Markdownでかっこをエスケープする

バックスラッシュ[]を使って特殊記号をエスケープできる。

誤:[Resolve\-DnsName](https://technet.microsoft.com/ja-jp/library/jj590781(v=wps.630).aspx)
正:[Resolve\-DnsName](https://technet.microsoft.com/ja-jp/library/jj590781\(v=wps.630\).aspx)

誤の場合は「~(v=wps.630).aspx)」の一つ目の閉じかっこでリンクが切れてしまう。

Powershellで名前解決する

なにも考えずにResolve-DnsNameする

PS C:> Resolve-DnsName google.com

Name                                           Type   TTL   Section    IPAddress
----                                           ----   ---   -------    ---------
google.com                                     AAAA   204   Answer     2404:6800:4004:80f::200e
google.com                                     A      204   Answer     216.58.197.238

(≒nslookup)

単純な名前解決だけでなく、リソースレコードを指定して名前解決することもできる。 以下はIPv6IPv4、MTAのリストの表示

PS C:\> Resolve-DnsName google.com -type AAAA

Name                                           Type   TTL   Section    IPAddress
----                                           ----   ---   -------    ---------
google.com                                     AAAA   231   Answer     2404:6800:4004:80f::200e


PS C:\> Resolve-DnsName google.com -type A

Name                                           Type   TTL   Section    IPAddress
----                                           ----   ---   -------    ---------
google.com                                     A      177   Answer     172.217.24.142


PS C:\> Resolve-DnsName google.com -type MX

Name                                     Type   TTL   Section    NameExchange                              Preference
----                                     ----   ---   -------    ------------                              ----------
google.com                               MX     2     Answer     alt4.aspmx.l.google.com                   50
google.com                               MX     2     Answer     alt3.aspmx.l.google.com                   40
google.com                               MX     2     Answer     aspmx.l.google.com                        10
google.com                               MX     2     Answer     alt2.aspmx.l.google.com                   30
google.com                               MX     2     Answer     alt1.aspmx.l.google.com                   20

参考