8. その他のツールと正規表現 

   8−1  コマンドプロンプト、PowerShell
   8−2  フィルタコマンド
   8−3  FINDSTR
   8−4  grep, sed, awk など
   8−5  Perl, Python, Ruby など

大量のテキストファイルを効率よく処理するため、多くのツールが生まれました。
その多くがUNIX環境のツール群を起源としています。
以降の内容は、主に Windows ユーザー向けということで書き進めます。

8−1  コマンドプロンプト、PowerShell

NECのPC-98x1、IBM系PC(DOS/V機)のOSが MS-DOS 全盛だった頃は、
「ファイル操作やソフトのインストールをするために、真っ黒な画面の左端に示されたプロンプト の横に点滅するカーソルに対して、キーボードからコマンドライン入力をしてプラグラムを実行。」
という操作は避けて通れない道でした。
 ◆ コマンドライン入力の例; "D:\>" の部分がプロンプト ◆

 D:\>COPY A:\*.TXT D:\TEMP

 Aドライブの、拡張子が TXT であるファイルを全て D:\TEMP にコピーします
こうしたパソコン操作を、マウスでウィンドウやアイコンを扱う GUIGraphical User Interface)に対して、 CUICharacter User Interface) といいます。
UNIX 系OSのユーザーならCUIベースの対話式操作に日頃から慣れ親しんでいることと思いますが、 Windowsしか知らないパソコンユーザーの中には、「コマンドラインにコマンドをキー入力して実行する」 という操作方法を一度もやったことがない方もいらっしゃるでしょう。 (LANケーブルが生きているかどうか確認するために「ping」コマンドを使ったことがある人はけっこういるかも。)
Windows系のコンピュータでコマンドラインから実行するツールを利用するには、
 ・「COMMAND.COM」 (MS-DOS 〜 Windows98 まで)
 ・「コマンドプロンプト」(cmd.exe) (WindowsNT3.1 〜 Windows 10)
 ・「Windows PowerShell」 (Windows7 〜 Windows10、Windows Server、MacOS、Linux)
を起動し、俗に「黒窓」「DOS窓」と呼ばれるウィンドウを開きます。
詳細は本サイト内のページ「 プロンプトを使おう 」などを参照して下さい。


8−2  フィルタコマンド

この章で以下に紹介するツール類は、コマンドラインからの実行を前提としたものです。 さらに言えば、その多くが「フィルタコマンド」というコマンド群に分類されます。 「標準入出力」という概念に馴染みのない Windowsユーザーへの詳細な説明はやはり 「プロンプトを使おう」 に譲りますが、ここでは大雑把に、
 (1) キーボード入力、あるいはテキストファイルを1行ずつ吸い込んで、
 (2) 取り込んだデータをそのコマンドの機能に沿って分析・加工し、
 (3) 結果を画面に次々と吐き出す
コマンドだということを理解できればいいのではないかと思います。

 ◆ フィルタコマンドの基本的な流れ ◆
入力テキスト | フィルタコマンド | 加工された文字列を画面出力

 ◆ フィルタの例 ◆
 Zaco's page
 I'm happy.
 WHO ARE YOU?_
 Thank you!
   :
   :
| 'a' は '♪' に置換せよ |  Z♪co's p♪ge
 I'm h♪ppy.
 WHO ARE YOU?_
 Th♪nk you!
   :
   :

これだけだと「結果を眺めてオワリ。」となってしまいますが、 DOS窓に画面表示される出力結果の文字列はテキストファイルに保存することができます。 これを「出力のリダイレクト」 といいます。


8−3  FINDSTR

実は、Windows自体にもコマンドラインで使えるグローバル検索用のツールがあらかじめ備わっています。 Windows9x 系には正規表現の使えない FIND が、現在の Windows にはそれに加えて、 簡単な(かなり貧弱な)正規表現を使える FINDSTR が組み込まれています。
検索文字列は、半角スペースで区切ることによって複数文字列の OR検索 を行うことが可能です。
検索結果は通常画面上に出力されますが、出力のリダイレクトにより、 ファイルに保存することができます。
FINDSTR "検索文字列"   (結果は画面へ出力)
FINDSTR "検索文字列" 処理ファイル(リスト) > 出力ファイル

FINDSTR /?   (詳しい使い方の説明が表示されます)
 ↓
FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/P]
 [/F:ファイル] [/C:文字列] [/G:ファイル] [/D:ディレクトリ一覧]
 [/A:色属性] [/OFF[LINE]] 文字列 [[ドライブ:][パス]ファイル名[ ...]]

/B 行の先頭にあるパターンを検索
/E 行の末尾にあるパターンを検索
/L 検索文字列をリテラルとして使用
/R 検索文字列を正規表現として使用
/S 現在のディレクトリとすべてのサブディレクトリから一致するファイルを検索
/I 検索するときに大文字と小文字を区別しない
/X 完全に一致する行を出力
/V 一致しない行のみを出力
/N 一致する各行の前に行番号を出力
/M ファイルに一致する行があるときに、ファイル名のみを出力
/O 一致する各行の前に文字オフセットを出力
/P 印刷不可能な文字を含むファイルをスキップ
/OFF[LINE] オフライン属性が設定されたファイルをスキップしない
/A:属性 2 桁の 16 進数で色属性を指定します。
/F:ファイル 指定したファイルからファイル一覧を読み取る (/ を指定するとコンソール)。
/C:文字列 指定された文字列をリテラル検索文字列として使用
/G:ファイル 指定されたファイルから検索文字列を取得 (/ を指定するとコンソール)。
/D:ディレクトリ セミコロンで区切られた検索されるディレクトリ文字列テキストの一覧を検索
[ドライブ:][パス]ファイル名 検索するファイルを指定

FINDSTR /C:"hello there" x.y と指定した場合はファイル x.y で "hello there" が検索されます。

<正規表現>
 . … 任意の文字
* … ゼロ個以上の直前の文字またはクラス
^ … 行頭
$ … 行末
[class] … セットの任意の 1 文字
[^class] … セット以外の任意の 1 文字
[x-y] … 指定した範囲の任意の文字
\x … メタ文字 x のリテラル使用
 … 単語の終わり

 C:\>FINDSTR "starfish jellyfish" old.txt > new.txt

   → old.txt の中にある "starfish" または "jellyfish" という文字列を含む
     行を検索し、その行だけを new.txt に書き出します。


8−4  grep, sed, awk など

第5章で秀丸エディタのgrep機能についても紹介しましたが、 grep は元々UNIXで使われていたテキスト検索用コマンドです。 現在ではWindowsにも移植されています。
Windows版の grep, sed, awkの入手はこちら
Windowsでは、実行ファイルをインストールした後、「MS-DOS プロンプト」または 「コマンド プロンプト」にコマンドを打ち込んで実行します。 検索文字列には正規表現が、ファイルリストにはワイルドカードが利用できます。
検索結果は通常画面上に出力されますが、出力のリダイレクトにより、 ファイルに保存することができます。
  grep '検索文字列' 対象ファイル(リスト)   (結果は画面へ出力)
  grep '検索文字列' 対象ファイル(リスト) > 出力ファイル

 C:\>grep '(star|jelly)fish' *.txt > list.dat

   → 拡張子が .txt である全ファイルの中にある 'starfish' または 'jellyfish'
      を含む行を検索し、結果(検索パターンに一致した文字列を含んでいる行)
      を list.dat というファイルに書き出します。

sed、awk は、読み込んだデータ行に対して、 文字列置換・数値計算などの加工をほどこした上で出力するコマンドです。 これらも UNIX から Windows へ移植されています。 あらかじめ作っておいた「スクリプトファイル」を読み込み、 利用することもできます。
以下は sed の例です。
  sed 'コマンド' 処理ファイル(リスト)   (結果は画面へ出力)
  sed 'コマンド' 処理ファイル(リスト) > 出力ファイル
  sed -f スクリプトファイル名 処理ファイル(リスト) > 出力ファイル

 C:\>sed 's/(star|jelly)fish/not fish/' old.txt > new.txt   
   → old.txt の中にある 'starfish' または 'jellyfish'という文字列を
      'not fish' に置換し、new.txt に書き出します。

◆ sedについて: RetroEngine: sedアーカイブ
◆ sedの解説: sed教室(仙石浩明氏)
◆ awkの初心者向け解説おすすめ: AWKの第一歩


8−5  Perl, Python, Ruby など

Perlはテキスト加工を中心として様々な機能を持った強力なプログラミング 言語です。grep, sed, awk と同等以上の機能を実現できるほか、Webに おけるCGIをプログラムする時にも最もよく使われる言語です。
Perl に似た言語として、Python や日本人が開発した Ruby があります。
本章ではこれらの言語自体の詳しい解説には立ち入らず、 雰囲気だけお見せします。下記はPerlの例です。
  perl -pe '1行スクリプト' ファイル(リスト)  (結果は画面へ出力)
  perl -pe '1行スクリプト' ファイル(リスト) > 出力ファイル名
  perl -ie '1行スクリプト' ファイル(リスト) (結果は入力ファイルへ書き戻し)
  perl スクリプトファイル名

 C:\>perl -pe 'tr/[a-z]/[A-Z]/;' fish.txt

   → fish.txt の中にある 小文字のアルファベットをすべて
      大文字に置換し、画面上に表示します。

 C:\>perl -pe 'tr/[a-z]/[A-Z]/;' fish.txt > uo.txt

   → fish.txt の中にある 小文字のアルファベットをすべて
      大文字に置換し、uo.txt に書き出します。

 C:\>perl -ie 'tr/[a-z]/[A-Z]/;' fish.txt

   → fish.txt の中にある 小文字のアルファベットをすべて
      大文字に置換し、 fish.txt 自体に書き戻します。

 C:\>perl test.pl

   → perlスクリプトを記述したファイル test.pl を読み込んで
      それに書かれたスクリプトを実行します。

次章よりしばらく、Perlを利用して正規表現を活用する様子を見てゆきたいと思います。 本ページでは Perl 自体の説明は最小限にとどめますので、下記のサイトなど Perl そのものの解説を参照してから 進む方がよいかと思います。

◆ Perl の初心者向け解説おすすめ: とほほのPerl入門
◆ Perl ver.5 の正規表現の一覧: ** 正規表現の対照表 **
◆ Python の初心者向け解説おすすめ: ニシキヘビを飼おう Python入門
◆ Ruby についての解説: RubyLife