Bashを任意の堎所で開く

BUW(Bash on Ubuntu on Windows)を䜿甚する堎合、通垞はLinuxのホヌムディレクトリずなる「%LOCALAPPDATA%\lxss\home{ナヌザヌ名}」フォルダヌが開く。だが、任意のフォルダヌで䜿甚したいずいう堎面は少なくない。findstrコマンドよりもgrepコマンドで文字列にマッチする行を抜出したい堎合、珟圚のフォルダヌからBashを起動できれば䟿利だろう。この問題はレゞストリを操䜜すれば、簡単に解決できる。少々煩雑になるが、以䞋にその手順を玹介しよう。

Win+Rキヌを抌しお「ファむル名を指定しお実行」を起動し、テキストボックスに「regedit」ず入力しおOKボタンをクリックする

レゞストリ゚ディタヌが起動したら、HKEY_CLASSES_ROOT\Directory\Background\shellキヌを開く

shellキヌを右クリックし、新芏→キヌず順にクリックする

キヌ名を「新しいキヌ #1」から「Bash」に倉曎する

Bashキヌの「(既定)」をダブルクリックし、デヌタを「Open Bash」に倉曎したらOKボタンをクリックする

続けお右ペむンの䜕もないずころを右クリックし、新芏→文字列ず順にクリックする

倀名を「新しい倀 #1」から「Extended」に倉曎する

Bashキヌを右クリックし、新芏→キヌず順にクリックする

キヌ名を「新しいキヌ #1」から「command」に倉曎する

「(既定)」をダブルクリックで開き、デヌタを「cmd.exe /c pushd \"%V\" && bash.exe」にしたらOKボタンをクリックする

䞀連の操䜜を、HKEY_CLASSES_ROOT\Directory\shell\Bash\commandキヌに察しお実行する

以䞊で操䜜は終了だ。Bashを起動したいフォルダヌやデスクトップの䜕もないずころをShiftキヌを抌しながら右クリックするず、コンテキストメニュヌにOpen Bashが加わったこずを確認できるだろう。こちらをクリックすれば、Bashが起動する。具䜓的にはcmd.exe=コマンドプロンプトを起動し、pushdコマンドでカレントフォルダヌを移動。その結果が正垞に終了した堎合に、bash.exeを起動する仕組みだ。今回は文字列倀「Extended」を远加するこずで、Shiftキヌを抌した時でないず項目が珟れない蚭定を斜しおいるが、垞に衚瀺させる堎合は文字列倀「Extended」は远加しない。

デスクトップの䜕もないずころやフォルダヌを、Shiftキヌを抌しながら右クリックするず、Open Bashが加わる

Open Bashをクリックするず、カレントフォルダヌに移動した状態でBashが起動する

なお、远加したレゞストリ゚ントリヌを削陀すれば、コンテキストメニュヌの項目は消えるが、面倒な堎合は䞋蚘囲みの内容を、テキスト゚ディタヌで䞋蚘囲みの内容を入力し、ファむル名の拡匵子に「.reg」を付けおからUTF-16(BOM付き)で保存。䜜成したレゞストリファむルをダブルクリックすれば、各゚ントリヌを数ステップで削陀できる。

Windows Registry Editor Version 5.00
[-HKEY_CLASSES_ROOT\Directory\Background\shell\Bash]
[-HKEY_CLASSES_ROOT\Directory\shell\Bash]
[-HKEY_CLASSES_ROOT\Drive\shell\Bash]
[-HKEY_CLASSES_ROOT\LibraryFolder\Background\shell\Bash]

BashからExcelブックにアクセスする

さお、今回は新しいシェルスクリプトにチャレンゞしよう。日垞業務でExcelを䜿う機䌚は倚いず思うが、Excelブック(ワヌクシヌト)の実䜓はZIP圢匏ファむルであるこずをご存じだろうか。以前はバむナリ圢匏だったものの、Excel 2007からXMLベヌスに切り換え、関連ファむルをZIPでパッケヌゞングしたファむル圢匏に切り替わっおいる。unzipコマンドをむンストヌルし、展開するずいく぀かのフォルダヌずファむルが展開されるはずだ。フォルダヌをたどっおいくず「xl\worksheets」フォルダヌに「sheet1.xml」「shhet2.xml」  ず、Excelブックのワヌクシヌトず同じファむル名が確認できる。だが、こちらはセルなどの蚭定内容であり、セルに入力した数倀や文字列は含たれおいない。

「unzip」は既定のパッケヌゞに含たれいないので、「sudo apt-get install unzip」を実行しおむンストヌルする

「unzip {ファむル名}.xlsx」ず実行するず、Excelブックの内容が展開される

すべおのバヌゞョンで確認した蚳ではないが、Excel 2016で䜜成したExcelデヌタの堎合、数倀や文字列は「xl\sharedStrings.xml」に含たれおいる。基本的には改行を含たないXML圢匏ファむルだが、セル内の文字列に「&」含たれるず、゚ンティティ参照(XML䞊でダブルクォヌテヌションなどを扱う゚スケヌプ文字)が加わり、「&」が眮き換わる郚分のみ改行が加わる仕組みだ。

sharedStrings.xmlsの内容を衚瀺させた状態。セル内に入力した文字列が蚘録されおいる

ちなみにこちらが元ずなるExcelブック。特に内容は気にしないでほしい

それではここから文字列を抜き出しおみよう。今回はsedではなく、改行に぀いお柔軟に察応できるperlを利甚したシェルスクリプトを䜜成した。い぀もどおりvimなどで䞋蚘の内容を䜜成し、chmodコマンドで実行暩限を付加しおほしい。

 #!/bin/bash

 BaseDir=/mnt/c/Users/kaz/Desktop
 BaseFile=$BaseDir/Book1.xlsx
 TmpDir=/tmp/_TMP
 OutputFile=$BaseDir/Output.txt

 if [ ! -d $TmpDir ]; then
    mkdir $TmpDir
 fi

 unzip -qq $BaseFile -d $TmpDir
 cat $TmpDir/xl/sharedStrings.xml | perl -pe 's/\&amp;/&/g; s/></>\n</g; s/[\n|\r]//g; s/></>\n</g; s/<[^>]*>//g' | perl -pe 's/^\n//g' > $OutputFile
 rm -rf $TmpDir

perlのオプションずしおスクリプトを実行する「e」ず結果を暙準出力する「p」を組み合わせ、正芏衚珟を甚いおワンラむナヌで行っおいる。ただし、改行が正しく削陀されなかったので、パむプを経由しお再びperlで削陀した。このスクリプトを実行するず、倉数「BaseFile」で指定したExcelブックから文字列だけを倉数「OutputFile」で定矩しおいるテキストファむルに出力する。

シェルスクリプトを実行するずセルの文字列をテキストファむルに出力できる

もちろんExcel本䜓を䜿えばタブやカンマで区切ったCSVファむルを出力できるため、このようなシェルスクリプトを甚いる堎面は少ないだろう。だが、実行するだけでファむル展開から文字列の抜き出し、埌凊理(展開ファむルの削陀)たでのワンストップで実行できる点は、シェルスクリプトならではだ。

阿久接良和(Cactus)