前回、sedコマンドのグルーピング機能「{ }」を使い、sedコマンドをスクリプト言語のように使う方法を紹介した。そこまでsedコマンドを使うことはあまりないのではないか……とは思うが、知っておいても損はない機能だったはずだ。
今回は、それよりはもう少し利用しやすい機能として、sedコマンドで行う処理を別ファイルに記述して利用する方法を紹介しよう。
命令をファイルにまとめて使うオプション「-f」
sedコマンドには「-f」というオプションが用意されており、引数としてファイルのパスを指定できるようになっている。対象のファイルには、これまで紹介してきたようなsedコマンドの処理を書いておく。
つまり、こういうことだ。前回は次のような書き方を紹介した。
sed -e 指定 -e 指定 -e 指定 -e 指定 ... ファイル
今回は、まず次のように記述したファイル「rule.sed」を用意する。
指定
指定
指定
...
指定
そして、-fオプションを指定してsedコマンドを実行するわけだ。
sed -f rule.sed ファイル
この機能は、どういうときに使えるのか。例えば、置換処理を100個、200個と書いておきたいとすると、それをsedコマンドの引数に全て指定するのは辛い。さらに、それが数千とか数万といった数になると、引数の数の上限に引っかかったり、コマンドラインのサイズ制限に引っかかったりして実行できない可能性がある。そうした場合に、こうやってファイルに書き出してから利用するわけだ。
「本当にコレ、使うことあるの? 」という懐疑的な読者のために、わかりやすく、かつ実用的なサンプルを1つ紹介しておこう。
Excelのデータをsedコマンドで自動編集する
業務によっては、1日の大半をMicrosoft Excelと過ごしている方もおられるだろう。最近のExcelは、データをXML形式で保存できるようになっているので、sedコマンドで簡単に加工することが可能なのだ。
例えば、次のような簡単な表を作ってみよう。
サンプルの表 |
本来値を入力するセルには、置換対象となる文字列を入れておく(ここでは「TANKA_A」とか「URIAGE_A」などとした)。それ以外のセルには、必要な計算式などを入れておけばよい。
次に、「xlsx」という拡張子を指定してこの表データを保存する(ここでは「月次売上表.xlsx」という名前にした)。このファイルは、展開すればsedコマンドで加工できる。
続いて、次のような編集用のシェルスクリプト「make_uriagehyo.sh」を作成する。
#!/bin/sh
#=====================================================================
# 作業用ディレクトリ作成
#=====================================================================
tmpd=$(mktemp -d tmpd_XXXXXX)
#=====================================================================
# EXCELファイルを展開
#=====================================================================
mkdir $tmpd/xlsx
cp 月次売上表.xlsx $tmpd/data.zip
unzip -d $tmpd/xlsx $tmpd/data.zip
#=====================================================================
# EXCELデータを加工
#=====================================================================
cat< $tmpd/rule.sed
s/TANKA_A/1980/
s/TANKA_B/3860/
s/TANKA_C/2980/
s/URIAGE_A/341/
s/URIAGE_B/221/
s/URIAGE_C/102/
EOF
sed -f $tmpd/rule.sed $tmpd/xlsx/xl/sharedStrings.xml > $tmpd/out
mv $tmpd/out $tmpd/xlsx/xl/sharedStrings.xml
#=====================================================================
# EXCELファイルを作成
#=====================================================================
(cd $tmpd/xlsx; zip -r ../../月次売上表_編集済.xlsx *)
#=====================================================================
# 作業ディレクトリを削除
#=====================================================================
rm -rf $tmpd
ここでは、保存された.xlsxファイルを展開して、特定のXMLファイルをsedコマンドで加工し、再度zipコマンドでまとめてExcelファイルとして出力するといった処理を行っている。
このスクリプトを実行した結果、生成されるファイル(ここでは「月次売上表_編集済.xlsx」というファイルが生成されている)をMicrosoft Excelで開くと次のようになる。
スクリプト実行後、生成されたファイルをExcelで開いたところ |
このようにsedコマンドを使えば、簡単にExcelファイルを編集することができる。やるべき作業をある程度シェルスクリプトで組んでおけば、こんな感じでほとんどの作業を自動化することが可能だ。もし、業務の多くがExcelデータの編集作業になっているのであれば、sedは素晴らしいツールになるだろう。
しかも、最近のWindows 10では「Windows Subsystem for Linux」を使ってUbuntuのコマンドセットをWindows上で利用できる。仕事の大半をシェルスクリプトで自動化しておき、業務中は難しい顔をしながらネットサーフィンをしているだけ……というのも夢ではないかもしれない。
sedコマンドのこうした使い方は作業効率の向上に効いてくるので、ぜひ一度お試しいただきたい。Excelファイル編集の自動化は、やり出したら癖になるほど便利だ。