CEXTRA 正規検索で文字列を抽出

書法

CEXTRA pattern [filename]* [option]*

SHELLMODE

@記述、!記述、#記述

詳細

ファイルから正規検索で文字列を抽出し出力する。
ファイルを複数指定すると、順次処理し、連結して出力する。 ファイル名を省略すると標準入力に対して処理を行う。

CEXTRA.EXEは従来からある CXTRA.EXE と同等の機能を持ち、モダンな正規検索表記を用いる。

検索パターン

正規検索そのものに付いては別途資料を参照すること。 検索は行単位で行う。

検索パターンの記述

検索パターンは以下の4種類の方法で記述できる。
  1. 第一パラメータ
    検索パターンが一つの場合は、通常この方法で記述する。 検索パターンの先頭に#!@がある場合は、 次の-Mオプションを用いるか、 あるいは、パターンの先頭にダミーの\:を置くと良い。
    空白("")にすると無効となる。
  2. オプション(-M
    直接コマンドラインにパターンを書ける。 第一パラメータが空文字列の場合は第一パラメータは無効となる。このオプションを複数書くことが出来る。 そうでなければ、第一パラメータを最初のパターンとし、このオプションで指定したパターンが順に二番目以降のパターンとなる。
  3. オプション(-P
    ファイルから検索パターンを読み込む。ファイルの1行が一つのパターンに相当する。
    行が空行ならばその行は無視する。
  4. オプション(-Q
    ファイルから検索パターンと形式指定文字列を読み込む。ファイルの1行が一つのパターンに相当する。
    行は、
    検索パターン tab 形式指定文字列
    の形式で、両項目とも空であってはならない。

上記のいずれの方法も混用できるが、混乱を避けるため、混用は避けたほうが良い。

複数の条件を記述した場合は、OR検索検索が出来る。 検定は条件の登場順に行い、条件が成立した時点で成立とする。 部分文字列の切り出しなどは最初に一致した条件に従って行う。

その他の指定

  1. 検索の際の大文字小文字の区別をしない指定ができる(-I)。
  2. 一致した文字列の替わりに部分文字列の出力を指定できる(-R)。 また、出力行を細かく指定して組み立てることができる(-E)。
  3. 出力行に行番号やファイル名を付加できる(-F,-G)。
  4. 文脈モードの出力を指定できる(-A,-AA)。 文脈モードでは、入力行の一致部分に、抽出文字列を埋め込んで出力する。 抽出文字列の指定がデフォルトあるいは部分文字列(-R)であった場合は、 それを明示するためにその両側を【】で囲んで出力する。 -Eオプションで抽出文字列の指定がされた場合はその文字列がそのまま埋め込まれる。
    -A指定では、一致のある行のみを出力。-AAではすべての行が出力される。 特に、-AAモードは実質的な文字列置換機能となる。
  5. ファイル単位での一致数を出力する指定がある(-C)。 また、全体での一致数を出力する指定がある(-T)。これらの指定をすると、指定以外の出力は行わない。

形式指定文字列

形式指定文字列は登場順に登録され、条件が成立したときのパターンの番号に対応する。 該当する形式指定文字列が無かった場合は、一番大きな番号の形式指定文字列を使用する。

形式指定文字列記述

全ての制御コードは出力しない。 制御コード以外の文字は以下にあげる文字を除いてそのまま出力される。

\\<\>自身
\a制御文字 BELL(07h)
\b制御文字 BS(08h)
\B'|'
\D複引用符 "
\e制御文字 ESC(1Bh)
\f制御文字 FF(0Ch)
\g>
\l<
\n制御文字 CRLF(0Dh,0Ah)
\r制御文字 出力しない
\s半角スペース
\S単引用符 '
\t制御文字 TAB(09h)
\v制御文字 HM(0Bh)
\hnn1バイトコード
\xnnnn2バイトコード(JIS)
\I入力文字列の全体
\0一致文字列の全体
\1-\9部分文字列
\=nn;部分文字列
\=nn:ログされた部分文字列のリスト
\=nn[一致文字列の先頭から部分文字列の先頭まで。部分文字列がなければ何も出力しない
\=nn]部分文字列の末尾から一致文字列の末尾まで。部分文字列がなければ一致文字列
\Nファイル内行番号
-Zが指定されている場合は、 一致文字列の先頭がある行番号。
\L出力データ相対番号
\Fファイル名
\[一致文字列の前まで
\]一致文字列の後
\/n,m/指定番号の位置マークの間の文字列。n省略では一致文字列の先頭、m省略では一致文字列の末尾。 位置が逆転していると文字列を後ろから前に出力する。
\(tsexpr)tsexprの結果。
形式指定文字列の中の TSEXPR のアプリケーション・インタフェース

部分文字列は、引数に部分文字列番号を入れて呼び出すが、??ustrmode / ??markmode / ??topmode / >>botmode / ??logmode で機能を切り替えることが出来る。
未定義あるいは、値が決まらなかった部分文字列やマークは sysbool(n) の値が偽となる。

sys(0)
??match
一致文字列
sys(n) nは1以上。デフォルトでは、番号(n)に相当する部分文字列。
モードにより返す値が異なる
部分文字列モード番号に相当する部分文字列
マーク位置モード番号に相当するマークの位置
マーク位置先頭モード番号に相当する部分文字列の先頭
マーク位置末尾モード番号に相当する部分文字列の末尾
部分文字列ログ出力モード番号に相当する文字列のログ
sys(-1)
??str
入力文字列の全体
sys(-2)
??top
一致文字列の先頭位置
sys(-3)
??bot
一致文字列の末尾位置
sys(-4)
??strlen
入力文字列の長さ
sys(-5)
??start
検索開始位置
sys(-6)
??levelmark
レベルマークの値
sys(-7)
??ustrcount
部分文字列定義の数
sys(-8)
??markcount
マーク定義の数
??patno 検索式番号(0〜)
sys(-10)
??ustrmode
部分文字列モードに切替
sys(-11)
??markmode
マーク位置モードに切替
sys(-12)
??topmode
部分文字列先頭位置モードに切替
sys(-13)
??botmode
部分文字列末尾位置モードに切替
sys(-14)
??logmode
部分文字列ログ出力モードに切替
sys(-100)
??filename
ファイル名
sys(-101)
??ln
ファイル内行番号
sys(-102)
??ix
出力データ相対番号
sys(-1000)
??first
行内の最初の出力項目で真(-XT,-XE,-XLのいずれかを指定したとき)

OPTION

-A
文脈モードを指定する。一致のある入力行に抽出文字列を埋め込んで出力する。
-AA
文脈モードを指定する。一致のある入力行に抽出文字列を埋め込んで出力する。 一致の無かった入力行はそのまま出力する。
-B
読み込みで0x0d と 0x00 をマスクしない。通常は指定しない。
-C[N]
ファイル毎にパターンの含まれる行数を出力する。
-CN パターンが一つ以上あるファイルのみ出力
-Estr
抽出データ行をstrとして出力する。 strは形式文字列指定。このオプションは複数回指定できる
-F
抽出データ行にファイル名、行番号をつける
-G
抽出データ行に行番号をつける
-HGn
幅0のマッチが返されたときの無限ループ対策。通常は指定しない
-HG0何も対策しない。無限ループする。
-HG1ポインタが進まなかったら、次の検索開始位置を+1する。
-HG2最初の検索を除き、検索開始位置での幅0一致を成立させない。
-HG3幅0マッチした直後の検索では、検索開始位置での幅0一致を成立させない。(デフォルト)
-HL[ + | - ]
入力文字列末(行末)でも検索をさせる。通常は指定しない
-HL有効にする
-HL+有効にする。
-HL-無効にする。(デフォルト)
-HSn
スタックサイズを指定する(MBytes)。nは0-1024。省略するか、値が0なら無制限。デフォルトは10。
-I
半角の大文字と小文字の区別をしない
-IF
半角、全角の大文字と小文字を区別しない
-Mpattern
検索のパターンを追加指定する。複数の記述が可能である。
指定したパターンのうち、一つでも成立すれば条件成立とみなす。
-Ofilename
指定のファイルへ出力を切り替える
-Pfilename
検索パターンをファイルで指定する。 1行が一つのパターンに相当し、空行は無視する。
-Qfilename
検索パターンと形式指定文字列をファイルで指定する。 1行が一つの組に相当する。行の形式は、
検索パターン tab 形式指定文字列
第一項目が検索パターンで、第二項目が形式指定文字列。 両項目は空ではいけない。ファイル内に少なくとも1件は存在すること。
-Rn
一致文字列の代わりに、部分文字列を出力する。nは部分文字列の番号
-S
検索パターンをスペース無視モードで解釈する。
この指定をすると検索パターン中の空白は無視する。また、#を書くと、行末までを注釈として扱う。
-T
全体を通してパターンの含まれる個数を出力する
-U
ユーザー文字列のログ機能を使用する。
記録した内容を見るためには、オプション-Rの指定、あるいは、オプション-Eの指定が必要である。
オプション-Rでは文字列間の区切り指定が有効となる。 文字列間の区切りは標準でタブ。
-U 区切りコードはタブ(\t)
-U; 区切りコードは改行(\r\n)
-U:str 区切りコードを指定の文字列にする。 str正規表現で書ける。 残念ながら\0を書くとそこで文字列は終了してしまう。
-W[0n|n]
埋めこみ行番号の出力形式を指定する。デフォルトは-W
-W 自由形式 -W→「123」
-Wn 固定幅スペース埋めこみ -W5→「  123」
-W0n 固定幅0埋めこみ -W05→「00123」
-XT[str]
行モード(-A-AA が指定されていない)で同一行内の出力をTABで区切る。行末で改行を出力する。 特に、-Eで出力する場合、
str を書くと区切りを文字列で指定できる。 str正規表現で書ける。 残念ながら\0を書くとそこで文字列は終了してしまう。
-XL[str]
-XT の機能に加えて、行に一致がないとき空行を出力する。
-XE
-XT-XL で -Eを利用して出力するとき、TABで区切らない。行末で改行を出力する。
-Y[位置番号]
再検索の基点を\/で指定した位置にする。 位置番号は1から9で、\/が現れる順番。 位置番号を省略するとデフォルトの一致文字列の終わりから次の検索を行う。
-Z[N]
ファイル全体を読みこんで1行として扱う。
また、出力ファイルの改行が\r\nではなく、\nである。必要な場合は後ろにconcatなどをはさむこと。
パターンでは、ファイル内の行末は\nで参照する。
このオプションを指定すると、-F-Gで出力する行番号は正しくない。 -Eで出力する行番号は正しい。
通常、ファイル末に行末が無い場合は読み込みのときに行末を付加するが、-ZNでは、この補正を行わない。

用例

参考

正規検索正規検索記述
LEXTRA行の正規検索

バージョン

Ver 1.022012/04/27検索文字列の上限廃止。複数の置換文字列を可能に。
Ver 1.012012/04/26-B オプション追加
Ver 1.00初版