EXTRA script [filename]* [option]*
ファイルから正規検索を利用して行を処理し標準出力する。 ファイルを複数指定すると、ファイルごとに順次処理する。 ファイル名を省略すると標準入力に対して処理を行う。
基本動作では、入力行を1行ずつ処理する。1行をパターンスペースに読み込み、アクションを記述順に適用し、パターンスペースが空でなければパターンスペースを出力し、パターンスペースを空にする。これを行サイクルと呼ぶ。
アクションは、アドレスとコマンドで構成され、アドレスに該当する行にコマンドを適用する。行サイクルの最後でのパターンスペースの出力を自動出力と呼んでいるが、これは、オプション(-N
)を指定すると抑制できる。
パターンスペースは行サイクルの間だけ有効だが、行サイクルを越えて値を保持するホールドスペースがある。ホールドスペースはコマンドでパターンスペースとやり取りできる。ホールドスペースはファイル処理の先頭でクリアされる。ホールドスペースは 16 本用意されている。それぞれ、0 - 15 の番号が振られている。
文字列を項目に分割して扱うためにフィールドスペースがある。フィールドスペースでは各項目を TSEXPR
式の中で@1など番号付き項目で参照できる。フィールドスペースにデータをセットする動作(キャプチャ)は意図的に記述しなければ行われないし、次のキャプチャが行われるまで内容を保持する。
行の置換や、その他の一部のコマンドでは結果をコンディションフラグという真偽値に保存する。コンディションフラグは分岐コマンド t
、T
では分岐の条件に使用される。また、アドレス要素「?
」でもコマンド実行の可否の決定に使われる。コンディションフラグの値は行サイクルの最初に初期化され、偽となっている。
コンディションフラグを保存回復するためのスタックがあり、コマンド「[
」「]
」で操作できる。このスタックは行サイクルの間だけ有効である。
論理値(オン・オフ)を保存するために 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 の中で引用できる情報は次の通り。
変数名 | 説明 |
---|---|
出力指定。この変数を引用すると、式評価終了後、改行を付加して出力する。 | |
??noprint | 出力抑制。この変数を引用すると、式評価後の出力を抑制する。デフォルトではこの状態。 |
??auto | 自動出力を有効にする。デフォルト。 |
??noauto | 自動出力を無効にする。 |
??filename | 処理中の入力ファイル名。 |
??outfilename | 出力ファイル名。 |
??filecount | 処理するファイルの数。標準入力を処理する場合は 0。 |
??fn | ファイル番号。 |
??gln | 通算行番号。 |
??ln | ファイル内行番号。 |
??hold ??hold00 〜 ??hold15 |
指定のホールドスペースの内容。??hold は 0 番目のホールドスペース。以下の書式で代入できる。??name := str 文字列 name は、hold 、hold00 〜 hold15 。
|
??hlc ??hlc00 〜 ??hlc15 |
指定のホールドスペースの行数。??hlc は 0 番目のホールドスペースの行数。必ず1以上。 |
??str | パターンスペースの内容。終了処理、ファイル終了処理でのみ有効。 |
??lc | パターンスペースの行数。必ず1以上。終了処理、ファイル終了処理でのみ有効。 |
??fld | タブ区切りのフィールドスペースの全体。以下の書式で代入できる。??fld:=str文字列
文字列の第一行だけが代入される。
|
??fldlf | 改行区切りのフィールドスペースの全体。以下の書式で代入できる。??fldlf:=str文字列
|
??mark ??mark00 〜 ??mark31 |
指定のマークの内容。??mark は 0 番目のマーク。以下の書式で代入できる。??name := bool 式 name は、mark 、mark00 〜 mark31 。
|
??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 | ||||||
n、m は数値。n で始まり、mの整数倍を加算した行番号で成立。例えば、 1~2 ならば、奇数行で成立する。 | ||||||
正規検索 | ||||||
/ereg/[@オプション] | ||||||
%ereg%[@オプション] | ||||||
_ceregc[@オプション] | ||||||
行(パターンスペース)に対する正規検索が成立すれば成立とする。 区切文字は、「 / 」、「% 」が選べる。
また、「_ 」を書けば、任意の文字「c」を区切り文字にできる。標準の記述モードでは、ereg 記述中に区切り文字を書く場合は区切り文字を二つ重ねる。 記述モードが「Umode」の場合には、区切り文字の前に「 \ 」をつける。「\ 」は「\\ 」と書く。オプションは次の文字の組み合わせ
| ||||||
フィールド正規検索 | ||||||
\number/ereg/[@オプション] | ||||||
\number%ereg%[@オプション] | ||||||
\number_ceregc[@オプション] | ||||||
フィールドスペースの指定項目に対する正規検索が成立すれば成立とする。 項目番号は、「 \ 」の後ろに数値(1〜)で指定する。項目番号に「$ 」を指定するとバッファの最後の項目。区切文字は、「 / 」、「% 」が選べる。
また、「_ 」を書けば、任意の文字「c」を区切り文字にできる。標準の記述モードでは、ereg 記述中に区切り文字を書く場合は区切り文字を二つ重ねる。 記述モードが「Umode」の場合には、区切り文字の前に「 \ 」をつける。「\ 」は「\\ 」と書く。オプションは次の文字の組み合わせ
| ||||||
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\改行 | |||||||||||||||||||||
現在行の後ろに追加して出力する。実際は、行の評価サイクルの終わりに出力している。 この書き方は解りにくいが、要するに行末に「 \ 」があれば、次の行もデータとする。「\ 」のない行末が最終行。
記述例
これは、「abc」、「def」の二行。
a\ 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\改行 | |||||||||||||||||||||
パターンスペースを削除して行を出力。 範囲指定されている場合は、範囲の最初に出力、範囲の間だけ削除が続く。 行サイクルを終わる。 この書き方は解りにくいが、要するに行末に「 \ 」があれば、次の行もデータとする。「\ 」のない行末が最終行。
記述例
これは、「abc」、「def」の二行。
c\ 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 で現在のホールドスペースを引用できる。式中で変数アクセスで動作制御できる。
| |||||||||||||||||||||
E | 式でホールドスペースを置換 | ||||||||||||||||||||
ETSEXPR 式; | |||||||||||||||||||||
TSEXPR 式を評価して、結果をホールドスペースに置く。 既定では、0 番目のホールドスペースに置くが、 ??holdpage に番号を代入することで、格納先を切り替えることができる。??str でパターンスペースを、??hold 、??hold00 〜 ??hold15 で現在のホールドスペースを引用できる。式中で変数アクセスで動作制御できる。
| |||||||||||||||||||||
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\改行 | |||||||||||||||||||||
現在行の前に出力。このコマンドが現れた時点で出力している この書き方は解りにくいが、要するに行末に「 \ 」があれば、次の行もデータとする。「\ 」のない行末が最終行。
記述例
これは、「abc」、「def」の二行。
i\ abc\ def | |||||||||||||||||||||
i@正規表現 | |||||||||||||||||||||
現在行の前に出力。このコマンドが現れた時点で出力している 正規表現で表した文字列を行として追加。データの終わりは スペースあるいは制御コードが現れる前まで。 | |||||||||||||||||||||
ic文字列c | |||||||||||||||||||||
現在行の前に出力。このコマンドが現れた時点で出力している 「c」は、半角スペース、「 @ 」、「\ 」以外の文字。「c」で挟んだ文字列を行とする。文字列中に「c」を書く場合は「cc」と書く。
| |||||||||||||||||||||
I | 式挿入 | ||||||||||||||||||||
ITSEXPR | |||||||||||||||||||||
TSEXPR 式を評価して行として出力する。
??str でパターンスペースを、??hold 、 ??hold00 〜 ??hold15 でホールドスペースを引用できる。
| |||||||||||||||||||||
j | コンディションフラグオン | ||||||||||||||||||||
j | |||||||||||||||||||||
t 、T コマンドで使用するコンディションフラグをオンにする。
| |||||||||||||||||||||
J | コンディションフラグオフ | ||||||||||||||||||||
j | |||||||||||||||||||||
t 、T コマンドで使用するコンディションフラグをオフにする。
| |||||||||||||||||||||
k | コンディションフラグ反転 | ||||||||||||||||||||
k | |||||||||||||||||||||
t 、T コマンドで使用するコンディションフラグを反転する。
| |||||||||||||||||||||
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オプション | |||||||||||||||||||||
パターンスペースの正規検索文字列に合致する文字列を置換文字列で置き換える。 通常は、置換が発生したとき、 t 、T で使用するコンディションフラグがオンになり、発生しなければオフになる。「c」はセパレータで任意の文字を指定できる。オプションは置換文字列の後の「c」に続けて書く。 置換文字列の中では特殊なエスケープシーケンスでデータをアクセスできる。s S コマンドでの置換文字列を参照のこと。 置換文字列中の TSEXPR のアプリケーション・インタフェースに関しては、s S コマンドでの置換文字列中のTSEXPR アプリケーション・インタフェースを参照のこと。 標準の記述モードでは、正規検索文字列と置換文字列の中で「c」を使う場合は、二つ重ねて「cc」と書く。長さ0の置換文字列は書けない。この場合は置換文字列として「 \_ 」を書くこと。記述モードが「Umode」の場合は、正規検索文字列と置換文字列の中で「c」は「 \ c」、「\ 」は「\\ 」と書く。正規検索文字列が空ならば、直前に書かれたアドレス要素の正規検索文字列を使用する。 オプションは次の文字を連ねて表す。
| |||||||||||||||||||||
S | 置換 | ||||||||||||||||||||
Sc正規検索文字列c d置換文字列dオプション | |||||||||||||||||||||
パターンスペースの正規検索文字列に合致する文字列を置換文字列で置き換える。s コマンドの正規検索文字列と置換文字列を離して書く記法。
| |||||||||||||||||||||
t | 条件分岐 | ||||||||||||||||||||
t [ラベル] | |||||||||||||||||||||
コンディションフラグが真ならばラベルへ分岐する。ラベルを省略すると行サイクルを終了する。 | |||||||||||||||||||||
T | 条件分岐 | ||||||||||||||||||||
T [ラベル] | |||||||||||||||||||||
コンディションフラグが偽ならばラベルへ分岐する。ラベルを省略すると行サイクルを終了する。 | |||||||||||||||||||||
v | 式評価 | ||||||||||||||||||||
vTSEXPR 式; | |||||||||||||||||||||
TSEXPR 式を評価する。
??str でパターンスペースを、??hold 、??hold00 〜 hold15 で現在のホールドスペースを引用できる。
| |||||||||||||||||||||
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文字が一致したように振舞う。オプションは次の文字を連ねて表す。
| |||||||||||||||||||||
Y | 文字置換 | ||||||||||||||||||||
Yc検索文字列c d置換文字列dオプション | |||||||||||||||||||||
パターンスペースの内の文字単位の置換。検索文字列に示される文字を対応する位置の置換文字列内の文字に置き換える。y の検索文字列と置換文字列を離して書く記法。
| |||||||||||||||||||||
z | 空 | ||||||||||||||||||||
z | |||||||||||||||||||||
パターンスペースの内容をクリアする。行はなくなるわけではなく、長さが 0 になるだけ。 | |||||||||||||||||||||
Z | 先頭行空 | ||||||||||||||||||||
Z | |||||||||||||||||||||
パターンスペースの先頭行をクリアする。一行だけしかない場合は、行が無くなるわけではなく、長さが 0 になるだけ。 | |||||||||||||||||||||
[ | コンディションフラグ退避 | ||||||||||||||||||||
[ | |||||||||||||||||||||
コンディションフラグをスタックに退避する。 | |||||||||||||||||||||
] | コンディションフラグ回復 | ||||||||||||||||||||
] | |||||||||||||||||||||
コンディションフラグをスタックから回復する。 |
条件での正規検索文字列や、sコマンドでの正規検索文字列を書く方法は二種類用意されている。 二つの方法は、文字列の前後を囲む区切り文字を文字列中に書く方法が異なる。
文字列の中で区切り文字を書く場合には、区切り文字を重ねて二つ書く。
文字列の中で区切り文字を書く場合には、「\
区切り文字」と書く。「\
」を書く場合にも「\\
」と書く。
モードの指定は、数種類の段階で指定できる。以下の記述で後に書くほうが優先度が高い。
EXTRA_MODE_U
」に "" でない値が設定されていれば、「Umode」
-U
」で指定した記述モード
*u;
」「*nou;
」を使用して指定
a@
、A@
、c@
、C@
、i@
コマンドでの正規表現でのデータ記述は半角スペースや制御コードが現れると終了する。
この中でのエスケープシーケンスは以下の通り
\行末 | 行末に「\」は次の行への継続を示す。次の行の行頭の半角スペースやタブは読み飛ばす。 |
\a | 0x07 Alert |
\b | 0x08 Back-space |
\t | 0x09 Tab |
\e | 0x1b Escape |
\f | 0x0c Form-Feed |
\n | 0x0a New-line |
\v | 0x0b Vertical-Tab |
\r | 0x0d Cr |
\s | 半角スペース |
\S | 「'」 |
\D | 「"」 |
\B | 「|」 |
\G | 「>」 |
\L | 「<」 |
\x | 0xnn 16進指定 |
アドレス指定、e
、E
、I
、v
コマンドの TSEXPR 中で使用できる変数、SYS 関数。
名称 | 変数名 | 機能番号 | 関数書式 |
---|---|---|---|
パターンスペース | ??str |
0 | @0 |
パターンスペースの内容。以下の書式で代入できる。??str := str 文字列 |
|||
ホールドスペース | -10 | @(-10) |
|
0 番目のホールドスペースの内容。 |
|||
ホールドスペース | ??hold 〜??hold15 |
||
指定番号のホールドスペースの内容。??hold では、0 番目のホールドスペース。以下の書式で代入できる。??name := str 文字列 name は、hold 、hold00 〜 hold15 。
|
|||
ホールドページ | ??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 〜??mark31 |
||
指定番号のマークの内容(論理値)。??mark では、0 番目のマーク。以下の書式で代入できる。??name := bool 式 name は、mark 、mark00 〜 mark31 。
|
|||
行末文字列 | ??eol |
|
|
行末文字列。以下の書式で代入できる。あまり長い文字列は設定できない。??eol := str 文字列 | |||
入力ファイル名 | ??filename |
-1 | @(-1) |
入力ファイル名 | |||
出力ファイル名 | ??outfilename |
|
|
出力ファイル名 | |||
ファイル数 | ??filecount |
||
処理するファイルの数。標準入力を処理する場合は 0。 | |||
ファイル番号 | ??fn |
-2 | &(-2) |
ファイル番号 | |||
通算行番号 | ??gln |
-3 | &(-3) |
通算行番号 | |||
行番号 | ??ln |
-4 | &(-4) |
行番号 | |||
ファイル末フラグ | ??eof |
-5 | sysbool(-5) |
ファイル末フラグ | |||
出力許可 | ??print |
|
|
この変数をアクセスすると結果を出力する。
e 、I コマンドで有効。
| |||
出力禁止 | ??noprint |
|
|
この変数をアクセスすると結果を出力しない。e 、I コマンドで有効。
| |||
削除 | ??delete |
|
|
この変数をアクセスするとコマンド終了後、パターンスペースを削除して行サイクルを終える。e 、I 、v コマンドで有効。
| |||
直接出力 |
|
bool SPOOL( str 文字列 ) |
|
文字列を直接出力する。 |
\\ | '\ ' 自身 |
\_ | ダミー。置換文字列が空の場合に使用する。 |
\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) |
\hnn | 1バイトコード |
\xnnnn | 2バイトコード(JIS) |
\I | 入力文字列の全体 |
\0 | 一致文字列の全体 |
\1-\9 | 部分文字列 |
\=nn; | 部分文字列 |
\=nn[ | 一致文字列の先頭から部分文字列の先頭まで。部分文字列がなければ何も出力しない |
\=nn] | 部分文字列の末尾から一致文字列の末尾まで。部分文字列がなければ一致文字列 |
\N | ファイル内行番号 |
\L | 出力データ相対番号 |
\F | ファイル名 |
\[ | 一致文字列の前まで |
\] | 一致文字列の後 |
\/n,m/ | 指定番号の位置マークの間の文字列。 n省略では一致文字列の先頭、m省略では一致文字列の末尾。 位置が逆転していると文字列を後ろから前に出力する。 |
\(TSEXPR) | TSEXPRの結果。 sys関数などの機能については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 で引用する場合には、パターンスペース内の行の置き方を意識しなければならない。特に複数行格納されている場合の扱いに注意が必要だ。ホールドスペースも大まかに言えばパターンスペースと同じ構造をしている。
行末コードが付かない文字列。
行末コード (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 式や、コマンドラインで変数代入(一括)で設定した変数を利用できる。
-A
-AP
-B
-Escript
-D
-Ffilename
-HA
-HSn
-N
-Ofilename
-Rstr
-S[tsexpr]
-U[+|-]
-U
、-U+
では記述モードを「Umode」にする。-U-
では記述モードを標準に戻す。
-X[template]
%1 | ??fn | ファイル番号 |
%2 | ??filename | 入力ファイル名 |
-Z
-ZR
Ver1.21 | 2013/08/23 | 正規表現検索で空の条件の補完機能。アドレス < > 追加。 |
Ver1.20 | 2013/08/23 | コマンド A! を導入。 |
Ver1.19 | 2013/05/03 | コマンド k と K を導入。 コマンド r / R に!オプションを追加。 オプション -D および スクリプトオプション *lf / *lflf 追加。 スクリプトオプション *noappend 追加。 |
Ver1.18 | 2013/04/09 | スクリプトオプション *n オプション -HA および スクリプトオプション *append 追加。 |
Ver1.17 | 2012/06/12 | コマンドライン ^記述 導入 |
Ver1.16 | 2012/06/05 | s / S コマンドにオプション q 導入 y / Y コマンド導入 |
Ver1.15 | 2012/06/01 | スクリプト置換オプション導入 |
Ver1.14 | 2012/05/31 | ??eol 導入 |
Ver1.13 | 2012/05/30 | マーク導入 |
Ver1.12 | 2012/05/26 | 「. 」 アドレス追加 |
Ver1.11 | 2012/05/24 | -X / -ZR オプション追加 L コマンド追加。 |
Ver1.10 | 2012/05/19 | ホールドスペース複数化。 S コマンド追加。 |
Ver1.09 | 2012/05/16 | オプション -E、-F を追加した。 |
Ver1.08 | 2012/05/12 | 終了処理/ファイル終了処理でパターンスペースを引用できるようにした。 正規検索アドレスで区切りに「%」を指定できない問題を解消した。 コマンド s に e オプション追加。 l Z o O コマンド追加。 |
Ver1.07 | 2012/05/11 | アドレスに項目比較導入。フィールドスペースセットコマンドを導入。 |
Ver1.06 | 2012/05/08 | コマンドラインでの変数代入を導入した |
Ver1.05 | 2012/04/25 | インタフェースの代入書式の仕様拡張に備えた変更をした |
Ver1.04 | 2012/04/22 | インタフェースの代入書式サポート |
Ver1.03 | 2012/04/21 | r R コマンドサポート |
Ver1.02 | 2012/04/19 | 項目バッファ全体を参照できるようにした 正規検索記述に「Umode」導入 |
Ver1.01 | 2012/04/15 | 項目バッファを導入 |
Ver1.00 | 2012/04/02 | 初版 |