EXTRA 正規検索で行を操作する

書法

EXTRA script [filename]* [option]*

SHELLMODE

@記述、!記述、^記述、#記述

概要

 ファイルから正規検索を利用して行を処理し標準出力する。 ファイルを複数指定すると、ファイルごとに順次処理する。 ファイル名を省略すると標準入力に対して処理を行う。

 基本動作では、入力行を1行ずつ処理する。1行をパターンスペースに読み込み、アクションを記述順に適用し、パターンスペースが空でなければパターンスペースを出力し、パターンスペースを空にする。これを行サイクルと呼ぶ。
 アクションは、アドレスとコマンドで構成され、アドレスに該当する行にコマンドを適用する。行サイクルの最後でのパターンスペースの出力を自動出力と呼んでいるが、これは、オプション(-N)を指定すると抑制できる。

 パターンスペースは行サイクルの間だけ有効だが、行サイクルを越えて値を保持するホールドスペースがある。ホールドスペースはコマンドでパターンスペースとやり取りできる。ホールドスペースはファイル処理の先頭でクリアされる。ホールドスペースは 16 本用意されている。それぞれ、0 - 15 の番号が振られている。

 文字列を項目に分割して扱うためにフィールドスペースがある。フィールドスペースでは各項目を TSEXPR 式の中で@1など番号付き項目で参照できる。フィールドスペースにデータをセットする動作(キャプチャ)は意図的に記述しなければ行われないし、次のキャプチャが行われるまで内容を保持する。

 行の置換や、その他の一部のコマンドでは結果をコンディションフラグという真偽値に保存する。コンディションフラグは分岐コマンド tT では分岐の条件に使用される。また、アドレス要素「?」でもコマンド実行の可否の決定に使われる。コンディションフラグの値は行サイクルの最初に初期化され、偽となっている。
 コンディションフラグを保存回復するためのスタックがあり、コマンド「[」「]」で操作できる。このスタックは行サイクルの間だけ有効である。

 論理値(オン・オフ)を保存するために 0 〜 31 のマークがある。マークは「m」「M」コマンドで操作し、アドレス条件「&」で検定できる。ファイル開始処理の直前に、すべてのマークはオフになる。

スクリプト

スクリプトは、頭書きと本体に分けられ、省略可能な頭書きの後に本体が続く。

頭書き
セクション
オプション
本体
アクション
ラベル
コメント
アドレス
コマンド

頭書き

開始処理などを TSEXPRを使用して指定できる。必要が無ければ省略してよい。次のように書く。

*セクション名 : TSEXPR 式 ;
または
*オプション;

それぞれのセクションは一度だけ指定できる。セクションを書く順序は自由である。
セクションの式はそれぞれ、評価されるだけだが、式の中で??printを使用すると、式の値を改行つきで出力できる。

セクション名称説明
開始処理 INIT プログラムの開始時に一度だけ実行する。
出力ファイルがオプション(-X)で個別に指定されている場合はファイルへの出力はできない。
終了処理 FINIT プログラムの終了時に一度だけ実行する。 出力ファイルがオプション(-X)で個別に指定されている場合はファイルへの出力はできない。
ファイル開始処理 BEGIN それぞれのファイル処理の最初に実行する。
ファイル終了処理 END それぞれのファイル処理の最後に実行する
オプション名称説明
出力指定 AUTO 自動出力を有効にする。(デフォルトと同じ)
出力抑制 NOAUTO
N
自動出力を無効にする。(-Nオプションと同じ)
ファイル追加モード APPEND Wコマンド / wコマンドでファイルを追加モードで開く。
ファイル作成モード NOAPPEND Wコマンド / wコマンドでファイルを新しく作る(デフォルト)。
記述モード変更 U 記述モードを「Umode」にする。
記述モード標準 NOU 記述モードを標準にする。
二重改行 LFLF パターンバッファ全体を出力するとき、改行を二度行う。
自動出力や、pコマンド、一部のコマンド(e/sなど)でのパターンの掃き出しが対象。 レコードモードで併用すると便利なことがある。
通常改行 LF パターンバッファ全体を出力するとき、改行を一度行う(デフォルト)。
行モード LINE 一度に1行ずつ読む標準の入力モード。
レコードモード RECORD 空行を区切りとして複数行をまとめて読む入力モード。オプション(-ZR)と同じ。
ファイルモード ZAP 一つのファイルをまとめて読む入力モード。オプション(-Z)と同じ。

 セクションで記述する TSEXPR の中で引用できる情報は次の通り。
変数名説明
??print 出力指定。この変数を引用すると、式評価終了後、改行を付加して出力する。
??noprint 出力抑制。この変数を引用すると、式評価後の出力を抑制する。デフォルトではこの状態。
??auto 自動出力を有効にする。デフォルト。
??noauto 自動出力を無効にする。
??filename 処理中の入力ファイル名。
??outfilename 出力ファイル名。
??filecount 処理するファイルの数。標準入力を処理する場合は 0。
??fn ファイル番号。
??gln 通算行番号。
??ln ファイル内行番号。
??hold
??hold00 〜 ??hold15
指定のホールドスペースの内容。??hold は 0 番目のホールドスペース。以下の書式で代入できる。
??name := str 文字列
name は、holdhold00hold15
??hlc
??hlc00 〜 ??hlc15
指定のホールドスペースの行数。??hlc は 0 番目のホールドスペースの行数。必ず1以上。
??str パターンスペースの内容。終了処理、ファイル終了処理でのみ有効。
??lc パターンスペースの行数。必ず1以上。終了処理、ファイル終了処理でのみ有効。
??fld タブ区切りのフィールドスペースの全体。以下の書式で代入できる。
??fld:=str文字列 文字列の第一行だけが代入される。
??fldlf 改行区切りのフィールドスペースの全体。以下の書式で代入できる。
??fldlf:=str文字列
??mark
??mark00 〜 ??mark31
指定のマークの内容。??mark は 0 番目のマーク。以下の書式で代入できる。
??name := bool
name は、markmark00mark31
??eol 行末文字列。以下の書式で設定できる。あまり長い文字列を設定できない。
??eol:=str文字列
SPOOL(str 文字列 ) 文字列を直接出力する。

オプション(-X)が指定されていない通常の処理手順は次の通り。

パラメータ解析
コマンドラインでの変数代入(-AP)
出力ファイル・オープン
開始処理
繰返し入力ファイル・オープンコマンドライン変数代入(-A)
ファイル開始処理
行サイクル
ファイル終了処理
入力ファイル・クローズ
終了処理
出力ファイル・クローズ

オプション(-X)で個別ファイル出力が指定されているときの処理手順は次の通り。

パラメータ解析
コマンドラインでの変数代入(-AP)
開始処理
繰返し出力ファイル・オープンコマンドライン変数代入(-A)
入力ファイル・オープン
ファイル開始処理
行サイクル
ファイル終了処理
入力ファイル・クローズ
出力ファイル・クローズ
終了処理

本体

 本体は、アクションを並べたものである。読み取った行に対してアクションを書かれた順番に実行する。

アクション

各アクションは次のように書く。

[アドレス[!]] コマンド[;]
または:ラベル
または#コメント行末

 アドレス指定で選択された行に対してコマンドを実行する。アドレスを省略するとすべての行に対してコマンドを実行する

 アドレスの後に「!」を書くとアドレスが成立しない場合にコマンドを実行する。

 コマンドとコマンドの区切り「;」は、誤解釈する恐れが無ければ書く必要はない。一般に行末はコマンド解析に影響しないが、ラベルや数値を取るコマンドの後に行末がある場合は、そこをコマンドの区切りとしている。

ラベル

 ラベルは、「b」、「t」、「T」コマンドでの分岐先として使用する。英文字で始まり、英数字が続く。最大32文字。

コメント

 コメントは「#」で始まり、行末までが範囲。残念ながらコマンドの途中やアドレスの途中などには書けない。行末で終わる無効アクションとして扱っている。

アドレス

 アドレスは、現在の行をコマンドに適用するか否かを決める。アドレスは要素を単独で書く方法と、二つの要素を書いて範囲を示す方法がある。

アドレスの後ろに「!」を書くとアドレスの意味を反転する。

単純指定
アドレス要素[!]
アドレス要素に成立すれば、コマンドを実行する。
範囲指定1
アドレス要素1,アドレス要素2[!]
最初はアドレス要素1が成立するかを検査する
アドレス要素1が成立した後は、アドレス要素2が成立するまでコマンドを実行する。 アドレス要素2が成立した行でもコマンドは実行する。
アドレス要素2が成立した後は、アドレス要素1の検査をする状態に戻る。
範囲指定2
アドレス要素1:アドレス要素2[!]
範囲指定1と同様だが、アドレス要素2が成立した行ではコマンドを実行しない。

アドレス要素は次の通り

行番号一致
n
数値で行番号を指定する。単独で書いた場合は、合致する行番号。
n,mのように範囲を指定した場合は、 n≦行番号≦m を満たす行の一致に用いられる。
それ以外では、行番号が初めてこの値以上になった場合に成立とする。
ステップ行番号
n~m
nm は数値。n で始まり、mの整数倍を加算した行番号で成立。例えば、 1~2 ならば、奇数行で成立する。
正規検索
/ereg/[@オプション]
%ereg%[@オプション]
_ceregc[@オプション]
行(パターンスペース)に対する正規検索が成立すれば成立とする。
区切文字は、「/」、「%」が選べる。 また、「_」を書けば、任意の文字「c」を区切り文字にできる。
標準の記述モードでは、ereg 記述中に区切り文字を書く場合は区切り文字を二つ重ねる。
記述モードが「Umode」の場合には、区切り文字の前に「\」をつける。「\」は「\\」と書く。
オプションは次の文字の組み合わせ
i半角英数:大文字小文字を区別しない。
I半角英数:大文字小文字を区別しない。全角英数:大文字小文字を区別しない。
x空白無視モード
フィールド正規検索
\number/ereg/[@オプション]
\number%ereg%[@オプション]
\number_ceregc[@オプション]
フィールドスペースの指定項目に対する正規検索が成立すれば成立とする。
項目番号は、「\」の後ろに数値(1〜)で指定する。項目番号に「$」を指定するとバッファの最後の項目。
区切文字は、「/」、「%」が選べる。 また、「_」を書けば、任意の文字「c」を区切り文字にできる。
標準の記述モードでは、ereg 記述中に区切り文字を書く場合は区切り文字を二つ重ねる。
記述モードが「Umode」の場合には、区切り文字の前に「\」をつける。「\」は「\\」と書く。
オプションは次の文字の組み合わせ
i半角英数:大文字小文字を区別しない。
I半角英数:大文字小文字を区別しない。全角英数:大文字小文字を区別しない。
x空白無視モード
TSEXPR 式検定
(TSEXPR 式)
TSEXPR式は論理値を返さなければならない。
参照:アドレス指定、e、E、 I コマンドでのアプリケーション・インタフェース
最終行
$
ファイルの最終行と一致する。
行数指定
+n
n は数値。範囲指定の右側(要素2)でのみ使用できる。左側が成立後、n 行後に成立。例えば、3,+5 と指定すれば、3,4,5,6,7,8 合わせて 6 行。
行塊指定
~n
n は数値。範囲指定の右側(要素2)でのみ使用できる。左側が成立後、n の倍数の行番号で成立。
コンディションフラグ検定
?
現在のコンディションフラグの値を反映する。
行有効
.
パターンスペースが空行でないとき有効。
マーク検定
& [n ]
n 番目のマークの状態。n は 0 〜 31。省略すると 0。
第一要素検定
<
直前に実行した範囲判定で、先頭のアドレス要素が真になった。
第二要素検定
>
直前に実行した範囲判定で、二番目のアドレス要素が真になった。

コマンド

コマンドの多くは英字一文字で表され、大文字小文字を区別する。

コマンド概要
{}複合行Mマークオフ
=行番号n次行
a行追加N次行追加
A行追加o出力(改行無)
b分岐O先頭行出力(改行無)
c行変更p出力
C行変更P先頭行出力
d行削除q中断
D先頭行削除Q中断
e式で置換rファイル入力
E式でホールドスペースを置換Rファイル行入力
fフィールドキャプチャs正規検索置換
F行キャプチャS正規検索置換
gホールドスペースから取得t条件分岐
Gホールドスペースから追加T条件分岐
hホールドスペースへ格納v式評価
Hホールドスペースへ追加wファイル出力
i行追加W先頭行ファイル出力
I式挿入x交換
jフラグオンy文字置換
JフラグオフY文字置換
kフラグ反転z
Kマーク反転Z先頭行空
l正規表現出力[フラグ退避
L先頭行正規表現出力]フラグ回復
mマークオン
コマンド一覧
{}複合行
{ [ アクション [;] ]* }
{ }」で囲んで複数のアクションをひとまとめにする。
=行番号
=
現在の行番号を改行を付加して出力する。
a行追加
a\改行
[\改行]*
改行
現在行の後ろに追加して出力する。実際は、行の評価サイクルの終わりに出力している。
この書き方は解りにくいが、要するに行末に「\」があれば、次の行もデータとする。「\」のない行末が最終行。
記述例
a\
abc\
def
これは、「abc」、「def」の二行。
a@正規表現
現在行の後ろに追加して出力する。実際は、行の評価サイクルの終わりに出力している。
正規表現で表した文字列を行として追加。データの終わりは スペースあるいは制御コードが現れる前まで。
ac文字列c
現在行の後ろに追加して出力する。実際は、行の評価サイクルの終わりに出力している。
c」は、半角スペース、「@」、「\」以外の文字。「c」で挟んだ文字列を行とする。文字列中に「c」を書く場合は「cc」と書く。
A行追加
A[!]\改行
[\改行]*
改行
パターンスペースに行を追加する。A!では改行を挟まず追加する。
A[!]@正規表現
パターンスペースに行を追加する。A!では改行を挟まず追加する。
正規表現で表した文字列を行として追加。データの終わりは スペースあるいは制御コードが現れる前まで。
A[!]c文字列c
パターンスペースに行を追加する。A!では改行を挟まず追加する。
c」は、半角スペース、「@」、「\」以外の文字。「c」で挟んだ文字列を行とする。文字列中に「c」を書く場合は「cc」と書く。
b分岐
b [ ラベル ]
指定のラベルへ制御を移す。ラベルを省略すると行サイクルの最後に分岐する。
c行変更
c\改行
[\改行]*
改行
パターンスペースを削除して行を出力。
範囲指定されている場合は、範囲の最初に出力、範囲の間だけ削除が続く。
行サイクルを終わる。
この書き方は解りにくいが、要するに行末に「\」があれば、次の行もデータとする。「\」のない行末が最終行。
記述例
c\
abc\
def
これは、「abc」、「def」の二行。
c@正規表現
パターンスペースを削除して行を出力。
範囲指定されている場合は、範囲の最初に出力、範囲の間だけ削除が続く。
行サイクルを終わる。
正規表現で表した文字列を行とする。データの終わりは スペースあるいは制御コードが現れる前まで。
cc文字列c
パターンスペースを削除して行を出力。
範囲指定されている場合は、範囲の最初に出力、範囲の間だけ削除が続く。
行サイクルを終わる。
c」は、半角スペース、「@」、「\」以外の文字。「c」で挟んだ文字列を行とする。文字列中に「c」を書く場合は「cc」と書く。
C行変更
C\改行
[\改行]*
改行
パターンスペースを置き換える。
C@正規表現
パターンスペースを置き換える。 正規表現で表した文字列を行とする。データの終わりは スペースあるいは制御コードが現れる前まで。
Cc文字列c
パターンスペースを置き換える。 「c」は、半角スペース、「@」、「\」以外の文字。「c」で挟んだ文字列を行とする。文字列中に「c」を書く場合は「cc」と書く。
d行削除
d
パターンスペースを削除。現在のサイクルを終了する。
D先頭行削除
D
パターンスペースの先頭行を削除する。
パターンスペースが空でなければ行サイクルの先頭へ制御を移す。 このとき、コンディションフラグとその保存は解除される。
パターンスペースが空ならば現在の行サイクルを終了する。
e式で置換
eTSEXPR 式;
TSEXPR 式を評価して、結果をパターンスペースに置く。 ??strでパターンスペースを、??hold??hold00??hold15 で現在のホールドスペースを引用できる。
式中で変数アクセスで動作制御できる。
変数名説明
??print結果を出力する。
??noprint結果を出力しない。(デフォルト)
??delete式評価後、パターンスペースを削除。行サイクルを終わる。
??cond:=truet コマンド、T コマンドで使用するコンディションフラグをオンにする。
??cond:=falset コマンド、T コマンドで使用するコンディションフラグをオフにする。
参照:アドレス指定、e、E、 I コマンドでのアプリケーション・インタフェース
E式でホールドスペースを置換
ETSEXPR 式;
TSEXPR 式を評価して、結果をホールドスペースに置く。
既定では、0 番目のホールドスペースに置くが、??holdpage に番号を代入することで、格納先を切り替えることができる。
??strでパターンスペースを、??hold??hold00??hold15 で現在のホールドスペースを引用できる。
式中で変数アクセスで動作制御できる。
変数名説明
??cond:=truet コマンド、T コマンドで使用するコンディションフラグをオンにする。
??cond:=falset コマンド、T コマンドで使用するコンディションフラグをオフにする。
参照:アドレス指定、e、E、I、v コマンドでのアプリケーション・インタフェース
fフィールドキャプチャ
f
パターンスペースの先頭の行をタブを区切りとしてフィールドスペースにセットする。
F行キャプチャ
F
パターンスペースをフィールドスペースにセットする。各行が項目に対応する。
gホールドスペースから取得
g [ n ]
n 番目のホールドスペースの内容をパターンスペースにコピーする。 n を省略すると 0 番のホールドスペースを使用する。
Gホールドスペースから追加
G [ n ]
パターンスペースに行末 (0x0a) を追加し、 n 番目のホールドスペースの内容を追加する。 n を省略すると 0 番のホールドスペースを使用する。
hホールドスペースへ格納
h [ n ]
パターンスペースの内容を n 番目のホールドスペースにコピーする。 n を省略すると 0 番のホールドスペースを使用する。
Hホールドスペースに追加
H [ n ]
n 番目のホールドスペースに行末 (0x0a) を追加し、パターンスペースの内容を追加する。 n を省略すると 0 番のホールドスペースを使用する。
i行挿入
i\改行
[\改行]*
改行
現在行の前に出力。このコマンドが現れた時点で出力している
この書き方は解りにくいが、要するに行末に「\」があれば、次の行もデータとする。「\」のない行末が最終行。
記述例
i\
abc\
def
これは、「abc」、「def」の二行。
i@正規表現
現在行の前に出力。このコマンドが現れた時点で出力している
正規表現で表した文字列を行として追加。データの終わりは スペースあるいは制御コードが現れる前まで。
ic文字列c
現在行の前に出力。このコマンドが現れた時点で出力している
c」は、半角スペース、「@」、「\」以外の文字。「c」で挟んだ文字列を行とする。文字列中に「c」を書く場合は「cc」と書く。
I式挿入
ITSEXPR
TSEXPR 式を評価して行として出力する。 ??strでパターンスペースを、??hold??hold00??hold15 でホールドスペースを引用できる。
変数名説明
??print結果を出力する。(デフォルト)
??noprint結果を出力しない。
??delete式評価後、パターンスペースを削除。行サイクルを終わる。
??cond:=truet コマンド、T コマンドで使用するコンディションフラグをオンにする。
??cond:=falseft コマンド、T コマンドで使用するコンディションフラグをオフにする。
jコンディションフラグオン
j
tT コマンドで使用するコンディションフラグをオンにする。
Jコンディションフラグオフ
j
tT コマンドで使用するコンディションフラグをオフにする。
kコンディションフラグ反転
k
tT コマンドで使用するコンディションフラグを反転する。
Kマーク反転
K [ n ]
n 番のマークを反転する。n は 0 〜 31。省略すると 0。
l正規表現出力
l
パターンスペースを正規表現で行末を付加して出力する。主に、制御コードを見るためにデバッグ用に使用する。
L先頭行正規表現出力
L
パターンスペースの先頭行を正規表現で行末を付加して出力する。主に、制御コードを見るためにデバッグ用に使用する。
mマークオン
m [ n ]
n 番のマークをオンにする。n は 0 〜 31。省略すると 0。
Mマークオフ
M [ n ]
n 番のマークをオフにする。n は 0 〜 31。省略すると 0。
n次行
n
自動出力が設定されていれば、パターンスペースを出力する。
次の行をパターンスペースに読み込み、行が無ければ行サイクルを終了する。行があれば、次のアクションへ進む。
N次行追加
N
パターンスペースに行末を追加し、さらに行を読み込んで追加する。行が無ければ、行サイクルを終了する。
o出力
o
自動出力の指定に関わらず、パターンスペースを出力する。改行しない。
O先頭行出力
O
パターンスペースの先頭行を出力する。改行しない。
p出力
p
自動出力の指定に関わらず、パターンスペースを出力する。
P先頭行出力
P
パターンスペースの先頭行を出力する。
q中断
q
パターンサイクルを終了し、現在のファイルの処理を中断する。自動出力が指定されていれば、パターンスペースの内容を出力する。
Q中断
Q
パターンサイクルを終了し、現在のファイルの処理を中断する。パターンスペースの内容は出力しない。
rファイル入力
r[!] filename
現在行の後にファイルの内容をすべて追加して出力する。実際は行サイクルの終わりに出力している。
r!ではファイルの内容を追加せずにその場で、直接出力する。
ファイル名は「'」「"」で囲むこともできる。
Rファイル行入力
R[!] filename
現在行の後にファイルから一行追加する。実際は行サイクルの終わりに追加している。
R!では行を追加せずにその場で出力する。
ファイル名は「'」「"」で囲むこともできる。
読み込む行が無くなると何もしない。 ファイルの処理は、入力ファイルの終わりでリセットされるので、すべての入力ファイルに対して、 同じ動作ができる。
s置換
sc正規検索文字列c置換文字列cオプション
パターンスペースの正規検索文字列に合致する文字列を置換文字列で置き換える。
通常は、置換が発生したとき、tT で使用するコンディションフラグがオンになり、発生しなければオフになる。
c」はセパレータで任意の文字を指定できる。オプションは置換文字列の後の「c」に続けて書く。 置換文字列の中では特殊なエスケープシーケンスでデータをアクセスできる。s S コマンドでの置換文字列を参照のこと。
置換文字列中の TSEXPR のアプリケーション・インタフェースに関しては、s S コマンドでの置換文字列中のTSEXPR アプリケーション・インタフェースを参照のこと。
標準の記述モードでは、正規検索文字列と置換文字列の中で「c」を使う場合は、二つ重ねて「cc」と書く。長さ0の置換文字列は書けない。この場合は置換文字列として「\_」を書くこと。
記述モードが「Umode」の場合は、正規検索文字列と置換文字列の中で「c」は「\c」、「\」は「\\」と書く。
正規検索文字列が空ならば、直前に書かれたアドレス要素の正規検索文字列を使用する。 オプションは次の文字を連ねて表す。
文字説明
e置換文字列を空文字列として扱う。(一致部分の削除)
i正規検索では、半角英数字の大文字小文字を区別しない
I正規検索では、半角英数字の大文字小文字を区別しない。全角英数字の大文字小文字を区別しない。
Jコンディションフラグを操作しない。
gすべて置換する。
p置換が成功したときパターンスペースを出力する。
q置換文字列をそのまま解釈せずに使用する。
x正規検索文字列では、空白を無視する。
X置換した文字列のみをパターンスペースにセット。一つも一致しなかった場合はパターンスペースを削除し、行サイクルを終了する。パターンスペースは出力されない。
S置換
Sc正規検索文字列c d置換文字列dオプション
パターンスペースの正規検索文字列に合致する文字列を置換文字列で置き換える。
s コマンドの正規検索文字列と置換文字列を離して書く記法。
t条件分岐
t [ラベル]
コンディションフラグが真ならばラベルへ分岐する。ラベルを省略すると行サイクルを終了する。
T条件分岐
T [ラベル]
コンディションフラグが偽ならばラベルへ分岐する。ラベルを省略すると行サイクルを終了する。
v式評価
vTSEXPR 式;
TSEXPR 式を評価する。 ??strでパターンスペースを、??hold??hold00hold15 で現在のホールドスペースを引用できる。
変数名説明
??delete式評価後、パターンスペースを削除。行サイクルを終わる。
??cond:=truet コマンド、T コマンドで使用するコンディションフラグをオンにする。
??cond:=falset コマンド、T コマンドで使用するコンディションフラグをオフにする。
参照:アドレス指定、e、E、I、v コマンドでのアプリケーション・インタフェース
wファイル出力
w filename
パターンスペースを指定のファイルへ出力。
ファイル名は「'」「"」で囲むこともできる。
最初の出力時にファイルを作成し、以降、追加していく。
入力ファイルが変わっても継続して追加する。
オプション(-HA)または、スクリプトオプション *append を指定するとファイルを作成せず、指定のファイルに追加する。
W先頭行ファイル出力
W filename
パターンスペースの先頭行を指定のファイルへ出力。
ファイル名は「'」「"」で囲むこともできる。
最初の出力時にファイルを作成し、以降、追加していく。
入力ファイルが変わっても継続して追加する。
オプション(-HA)または、スクリプトオプション *append を指定するとファイルを作成せず、指定のファイルに追加する。
x交換
x [ n ]
n 番目のパターンスペースとホールドスペースを入れ替える。 n を省略すると 0 番のホールドスペースを使用する
y文字置換
yc検索文字列c置換文字列cオプション
パターンスペースの内の文字単位の置換。検索文字列に示される文字を対応する位置の置換文字列内の文字に置き換える。
検索文字列、置換文字列は、正規表現で表記する。 「c」はセパレータで任意の文字を指定できる。オプションは置換文字列の後の「c」に続けて書く。 標準の記述モードでは、検索文字列と置換文字列の中で「c」を使う場合は、二つ重ねて「cc」と書く。長さ0の置換文字列は書けない。この場合は置換文字列として「\_」を書くこと。
記述モードが「Umode」の場合は、検索文字列と置換文字列の中で「c」は「\c」、「\」は「\\」と書く。
検索文字列が置換文字列より長い場合は、検索文字列に含まれるが、置換文字列に対応する文字がない場合が生ずる。このとき、対応する文字がない場合は置換文字列の最後の文字に変換する。オプション dを指定した場合には、対応する文字が無ければその文字は削除する。
オプション e を指定すると、検索文字列にない文字は、置換文字列を無視して、削除する。
オプション s を指定すると、検索文字列にある文字は、置換後、同一文字の連続を一文字に圧縮する。
オプション c を指定すると、検索文字列にない文字が置換対象となる。あたかも検索文字列の先頭の1文字が一致したように振舞う。
オプションは次の文字を連ねて表す。
文字説明
c検索文字列にない文字を一致と判断する
d置換文字列に対応する文字がない場合、削除する
e常に削除する。
s同一文字の連続を一文字に圧縮する
Y文字置換
Yc検索文字列c d置換文字列dオプション
パターンスペースの内の文字単位の置換。検索文字列に示される文字を対応する位置の置換文字列内の文字に置き換える。
yの検索文字列と置換文字列を離して書く記法。
z
z
パターンスペースの内容をクリアする。行はなくなるわけではなく、長さが 0 になるだけ。
Z先頭行空
Z
パターンスペースの先頭行をクリアする。一行だけしかない場合は、行が無くなるわけではなく、長さが 0 になるだけ。
[コンディションフラグ退避
[
コンディションフラグをスタックに退避する。
]コンディションフラグ回復
]
コンディションフラグをスタックから回復する。

附記

記述モード

条件での正規検索文字列や、sコマンドでの正規検索文字列を書く方法は二種類用意されている。 二つの方法は、文字列の前後を囲む区切り文字を文字列中に書く方法が異なる。

  1. 標準の記述モード

    文字列の中で区切り文字を書く場合には、区切り文字を重ねて二つ書く。

  2. 「Umode」

    文字列の中で区切り文字を書く場合には、「\区切り文字」と書く。「\」を書く場合にも「\\」と書く。

モードの指定は、数種類の段階で指定できる。以下の記述で後に書くほうが優先度が高い。

  1. デフォルトは標準の記述モード
  2. 環境文字列「EXTRA_MODE_U」に "" でない値が設定されていれば、「Umode」
  3. コマンドライン・オプション「-U」で指定した記述モード
  4. スクリプトの頭書きで、「*u;」「*nou;」を使用して指定

a@、A@、c@、C@、i@ コマンドでの正規表現

a@A@c@C@i@ コマンドでの正規表現でのデータ記述は半角スペースや制御コードが現れると終了する。 この中でのエスケープシーケンスは以下の通り

\行末 行末に「\」は次の行への継続を示す。次の行の行頭の半角スペースやタブは読み飛ばす。
\a0x07 Alert
\b0x08 Back-space
\t0x09 Tab
\e0x1b Escape
\f0x0c Form-Feed
\n0x0a New-line
\v0x0b Vertical-Tab
\r0x0d Cr
\s半角スペース
\S「'」
\D「"」
\B「|」
\G「>」
\L「<」
\x0xnn 16進指定

アドレス指定、e、E、I、v コマンドでのアプリケーション・インタフェース

アドレス指定、eEIv コマンドの TSEXPR 中で使用できる変数、SYS 関数。

名称変数名機能番号関数書式
パターンスペース ??str 0 @0
パターンスペースの内容。以下の書式で代入できる。
??str := str 文字列
ホールドスペース -10 @(-10)
0 番目のホールドスペースの内容。
ホールドスペース ??hold
??hold00
??hold15
指定番号のホールドスペースの内容。??hold では、0 番目のホールドスペース。以下の書式で代入できる。
??name := str 文字列
name は、holdhold00hold15
ホールドページ ??holdpage
E コマンドで格納するホールドスペースの番号。以下の書式で代入する。
??holdpage:=int番号
パターンスペースの行数 ??lc
パターンスペースの行数。必ず 1 以上。
ホールドスペースの行数 ??hlc??hlc00??hlc15
指定のホールドスペースの行数。??hlc は 0 番目のホールドスペース。必ず 1 以上。
フラグ値 ??cond
現在のコンディションフラグの値。以下の書式で代入できる
??cond := bool 設定値
フィールドキャプチャ ??setfld
パターンスペースの内容をフィールドスペースにセットする。
パターンスペースの第一行をタブ区切りとして項目(フィールド)を取り出し保存する。
行キャプチャ ??setfldlf
パターンスペースの内容をフィールドスペースにセットする。
パターンスペースの各行を項目として取り出し保存する。
フィールド全体 ??fld
タブ区切りのフィールドスペースの全体。以下の書式で代入できる。
??fld := str 文字列
第一行の各項目を TAB を区切りとして取り出し、フィールドスペースにセットする。
フィールド全体 ??fldlf
改行区切りのフィールドスペースの全体。以下の書式で代入できる。
??fldlf := str 文字列
文字列の各行を取り出しフィールドスペースにセットする。入力文字列の各行は行末(x0a)で区切られ、最終行の後には行末がない。(これはパターンバッファと同じ形式)。
項目数 ??fc
フィールドスペースにある項目数。
項目 n @n
フィールドスペースにある項目(1〜)。
マーク ??mark
??mark00
??mark31
指定番号のマークの内容(論理値)。??mark では、0 番目のマーク。以下の書式で代入できる。
??name := bool
name は、markmark00mark31
行末文字列 ??eol
行末文字列。以下の書式で代入できる。あまり長い文字列は設定できない。
??eol := str 文字列
入力ファイル名 ??filename -1 @(-1)
入力ファイル名
出力ファイル名 ??outfilename
出力ファイル名
ファイル数 ??filecount
処理するファイルの数。標準入力を処理する場合は 0。
ファイル番号 ??fn -2 &(-2)
ファイル番号
通算行番号 ??gln -3 &(-3)
通算行番号
行番号 ??ln -4 &(-4)
行番号
ファイル末フラグ ??eof -5 sysbool(-5)
ファイル末フラグ
出力許可 ??print
この変数をアクセスすると結果を出力する。 eI コマンドで有効。
出力禁止 ??noprint
この変数をアクセスすると結果を出力しない。
eI コマンドで有効。
削除 ??delete
この変数をアクセスするとコマンド終了後、パターンスペースを削除して行サイクルを終える。
eIv コマンドで有効。
直接出力 bool SPOOL( str 文字列 )
文字列を直接出力する。

s S コマンドでの置換文字列

\\'\' 自身
\_ダミー。置換文字列が空の場合に使用する。
\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] 部分文字列の末尾から一致文字列の末尾まで。部分文字列がなければ一致文字列
\N ファイル内行番号
\L出力データ相対番号
\Fファイル名
\[一致文字列の前まで
\]一致文字列の後
\/n,m/ 指定番号の位置マークの間の文字列。 n省略では一致文字列の先頭、m省略では一致文字列の末尾。 位置が逆転していると文字列を後ろから前に出力する。
\(TSEXPR) TSEXPRの結果。
sys関数などの機能についてはs S コマンドでの置換文字列中のTSEXPR アプリケーション・インタフェースを参照のこと。

s S コマンドでの置換文字列中のTSEXPR アプリケーション・インタフェース

機能番号関数表記変数表記説明
0 @0 ??match 一致文字列
n @(n) nは1以上。デフォルトでは、番号(n)に相当する部分文字列。
モードにより返す値が異なる
部分文字列モード番号に相当する部分文字列
マーク位置モード番号に相当するマークの位置
マーク位置先頭モード番号に相当する部分文字列の先頭
マーク位置末尾モード番号に相当する部分文字列の末尾
-1 @(-1) ??str 入力文字列の全体、すなわちパターンスペースの内容
??hold??hold00??hold15 指定のホールドスペースの内容。??hold は 0 番目のホールドスペースの内容。
-2 &(-2) ??top 一致文字列の先頭位置
-3 &(-3) ??bot 一致文字列の末尾位置
-4 &(-4) ??strlen 入力文字列の長さ
-5 &(-5) ??start 検索開始位置
-6 &(-6) ??levelmark レベルマークの値
-7 &(-7) ??ustrcount 部分文字列定義の数
-8 &(-8) ??markcount マーク定義の数
-10 SYS(-10) ??ustrmode 部分文字列モードに切替
-11 SYS(-11) ??markmode マーク位置モードに切替
-12 SYS(-12) ??topmode 部分文字列先頭位置モードに切替
-13 SYS(-13) ??botmode 部分文字列末尾位置モードに切替
-100 @(-100) ??filename ファイル名
-101 &(-101) ??fn ファイル番号
-102 &(-102) ??gln 通算行番号
-103 &(-103) ??ln 行番号
-104 &(-104) ??ix 行内一致番号
-105 SYSBOOL(-105) ??eof 最終行

パターンスペースでの行の連結

 複雑なスクリプトを書いたり、TSEXPR で引用する場合には、パターンスペース内の行の置き方を意識しなければならない。特に複数行格納されている場合の扱いに注意が必要だ。ホールドスペースも大まかに言えばパターンスペースと同じ構造をしている。

パターンスペースの内容が1行の場合

行末コードが付かない文字列。

パターンスペースの内容が複数行の場合

 行末コード (LF 0x0A)が行の間に入る。最後の行の行末には行末コードが付かない。
TSEXPR ではこの点を意識する必要がある。 行集合として一連の line_xxx 関数を適用する場合には、末尾に LF を付加して処理し、戻すときには最後の LF を外す必要がある。
そのまま処理するなら SEP_xxx 関数でセパレータが LF であるとすれば、処理しやすい。

 パターンスペースの行数は、行末コードの数+1である。 D コマンド、 P コマンドでいうところの先頭行は、複数行あるときは、先頭から改行コードまで。 単数行の場合は、パターンスペースのすべてである。

コマンドラインでの変数代入

 スクリプトに値を与える方法は色々あるが、簡易なものとしてコマンドラインでの変数代入がある。変数代入はオプション(-A/-AP)で有効にできる。
コマンドライン代入は、コマンドラインの要素として次のように書く。

?変数名:=

 これは、TSEXPR の名前付き変数に対する代入である。内部でも単に TSEXPR 式として扱い、外部変数機能のない単純な式評価を行っている。
 オプション(-A)を指定すると、ファイル名を順に解釈しているとき、変数代入があれば、その評価を行う。従って、ファイル名と変数代入の順序は意味がある。あるファイルの処理で必要な変数は、それ以前の記述で代入されていなければならない。
 また、このとき、変数への代入は、開始処理の後に行われるので、開始処理でこれを引用できない。

 オプション(-AP)を指定すると、すべての変数代入をファイル処理に先立って行う。 このときは、開始処理の前に変数代入が行われるので、開始処理でも変数を引用できる。
 個別の変数を最初に初期化したい場合には、コマンドライン間接展開の機能を利用すると良い。 例えば、!^^?varname=val のように書ける。

スクリプト置換

 スクリプトを汎用化しようとすると、スクリプト自体に外部から与えた文字列などを差し込みたいことがある。コマンドラインの間接展開(!記述など)を使えば実現できるが、記述が多少技巧的になる。そこで、スクリプトをコンパイルする前に引数置換する機能を設けた。
 オプション(-S)を指定すると引数置換機能が働く。引数置換は、オプション解析、コマンドラインでの変数一括代入(-AP)の後に行うので、オプション(-S)の TSEXPR 式や、コマンドラインで変数代入(一括)で設定した変数を利用できる。

OPTION

-A
コマンドラインでの変数代入を行う。
ファイル名と変数代入の順序は意味がある。
-AP
コマンドラインでの変数代入を行う。
すべての変数代入は、ファイル処理の前に行われる。
-B
0x0d を出力でフィルタしない。
通常の処理では、出力中の 0x0d を無視し、0x0a を定義された改行文字として出力している。
-Escript
スクリプトを1行追加する。何度でも書ける
-D
パターンバッファ全体の出力(自動出力や、pコマンドなど)の際に、改行を二度行う。
レコードモード(-ZR)のときに併用すると良い。
-Ffilename
スクリプトをファイルから追加する。
-HA
W / w コマンドでファイルを追加モードで開く。
-HSn
正規検索の作業領域の上限をMB単位で指定する。デフォルトは30。
-N
自動出力機能をオフにする
-Ofilename
指定のファイルへ出力を切り替える
-Rstr
出力の改行文字を正規表現で表す。デフォルトは\r\n。
-S[tsexpr]
スクリプトをコンパイルする前に引数置換を行う。
このオプションに書くtsexpr式はオプション解析時に実行する。ここで変数代入をすれば、 引数置換でその値を引用できる。
-U[+|-]
記述モードを変更する。 -U-U+ では記述モードを「Umode」にする。
-U- では記述モードを標準に戻す。
-X[template]
入力ファイルに対応して個別のファイルを出力する。
出力ファイル名は template を引数置換して指定する。
%1??fnファイル番号
%2??filename入力ファイル名
template を省略すると、8桁連番+「.txt」のファイル名が指定される。
-Z
入力モードをファイルモードに切り替える。ファイルの先頭ですべての行を読み込んでパターンスペースにセットする。 従って一つのファイルでは、一度だけ行サイクルが動作する。
-ZR
入力モードをレコードモードに切り替える。空行を区切りとして複数行を一度に読み込む。連続した空行もまとめて入力単位の一つの区切りとして扱う。
行番号は、入力単位で番号付けられるので、実質的にはレコード番号となる。

用例

参考

バージョン

Ver1.212013/08/23 正規表現検索で空の条件の補完機能。アドレス < > 追加。
Ver1.202013/08/23 コマンド A! を導入。
Ver1.192013/05/03 コマンド k と K を導入。
コマンド r / R に!オプションを追加。
オプション -D および スクリプトオプション *lf / *lflf 追加。
スクリプトオプション *noappend 追加。
Ver1.182013/04/09 スクリプトオプション *n
オプション -HA および スクリプトオプション *append 追加。
Ver1.172012/06/12 コマンドライン ^記述 導入
Ver1.162012/06/05 s / S コマンドにオプション q 導入
y / Y コマンド導入
Ver1.152012/06/01 スクリプト置換オプション導入
Ver1.142012/05/31 ??eol 導入
Ver1.132012/05/30 マーク導入
Ver1.122012/05/26 .」 アドレス追加
Ver1.112012/05/24 -X / -ZR オプション追加
L コマンド追加。
Ver1.102012/05/19 ホールドスペース複数化。
S コマンド追加。
Ver1.092012/05/16 オプション -E、-F を追加した。
Ver1.082012/05/12 終了処理/ファイル終了処理でパターンスペースを引用できるようにした。
正規検索アドレスで区切りに「%」を指定できない問題を解消した。 コマンド s に e オプション追加。 l Z o O コマンド追加。
Ver1.072012/05/11 アドレスに項目比較導入。フィールドスペースセットコマンドを導入。
Ver1.062012/05/08 コマンドラインでの変数代入を導入した
Ver1.052012/04/25 インタフェースの代入書式の仕様拡張に備えた変更をした
Ver1.042012/04/22 インタフェースの代入書式サポート
Ver1.032012/04/21 r R コマンドサポート
Ver1.022012/04/19 項目バッファ全体を参照できるようにした
正規検索記述に「Umode」導入
Ver1.012012/04/15項目バッファを導入
Ver1.002012/04/02初版