[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.4 csplit: ファイルを内容を目印にして分割する。

csplit は、入力ファイル input を分割して 0 個以上の出力ファイルを生成する。 input が ‘-’ である場合は、標準入力から読み込む。

書式:

 
csplit [option]… input pattern

出力ファイルの中身がどうなるかは、以下で詳しく述べるように、引数 pattern によって決まってくる。引数 pattern が、 入力ファイル中に存在しない行を指している場合は、エラーになる (たとえば、入力の残りの部分に、指定された正規表現にマッチする行がもう存在しない場合)。 すべてのパターン・マッチが終わったとき、残っている入力があれば、 最後の出力ファイルに書き出される。

デフォルトでは、csplit は、出力ファイルを生成した後で、 各出力ファイルに書き込んだバイト数を表示する。

パターン引数 pattern には、以下のタイプがある。

n

入力の最初から n 行目の直前までを含む (つまり、n-1 行目までの) 出力ファイルを作成する (n は正の整数)。繰り返し回数の指定が後に続く場合は、 繰り返しごとに、入力ファイルの次の n 行分を含む出力ファイルを作成していく。 (訳注: パターンが N の場合は、あと何回繰り返すかを正確かつ具体的に指定しなければならない。 すなわち、回数が多かったり、{*} を指定すると、‘-k’ も指定しないかぎり、 エラーになり、出力ファイルが作成されない。)

/regexp/[offset]

現在行から、入力ファイル中の次に regexp にマッチする行の直前までを内容とする (すなわち、マッチする行は含まない) 出力ファイルを作成する。 整数の offset を指定してもよい。指定した場合は、マッチする行にプラス/マイナス offset した行の直前までの入力が (つまり、その行は含まない)、 出力ファイルに書き込まれ、書き込まれた次の行から入力の後続部分が始まることになる。

%regexp%[offset]

上記のタイプと同様だが、出力ファイルを作成しない点が異なる。 要するに、入力ファイルのその部分は捨てられることになるわけだ。

{repeat-count}

直前に行ったパターンの検索を、さらに repeat-count 回繰り返す。 repeat-count には正の整数か、アステリスクを指定できる。後者は、 入力がなくなるまで、必要なだけ何回でも繰り返すことを意味する。 (訳注: ‘csplit input '/pattern_1/' '{3}' '/pattern_2/' '{*}'’ のように使用する。)

出力ファイルの名前は、接頭辞 (prefix、デフォルトでは ‘xx’) に接尾辞 (suffix) を続けたものになる。デフォルトの接尾辞は、二桁の 10 進数を ‘00’ から ‘99’ まで順番に増やして行ったものである。いかなる場合でも、 出力ファイルを、ファイルの名前によってソートした順番で結合すると、 元の入力ファイルが生成されるようになっている。

csplit のデフォルトでは、エラーになった場合や、ハングアップ、 割り込み、中止、終了といったシグナルを受け取った場合には、 それまでに作成した出力ファイルをすべて消去してから終了する。

このプログラムでは以下のオプションが使用できる。参照: 共通オプション.

-f prefix
--prefix=prefix

prefix を出力ファイル名の接頭辞として使用する。

-b format
--suffix-format=format

format を出力ファイル名の接尾辞として使用する。 このオプションを指定する場合、接尾辞として指定する文字列には、printf(3) 方式の変換指定が必ず一つは (それも、一つだけ) 含まれていなければならない。 変換指定には、形式指定フラグ、フィールド幅、精度指定といった修飾子を付けてもよく、 3 種の修飾子をすべて付けることもできる。 フォーマット文字は、バイナリの符号なし整数である引数を、 人間に読みやすい形式に変換するものでなければならない。フォーマット文字の ‘d’ と ‘i’ は、‘u’ の別名であり、‘u’, ‘o’, ‘x’, ‘X’ 変換が可能である。format の全体が (現在の出力ファイルが何番目かという情報とともに) sprintf(3) 関数に引き渡され、出力ファイルの一つ一つに対して、ファイル名に使う接尾辞が順番に作られることになる。 なお、このオプションを使用すると、‘--digits’ オプションは無視される。

-n digits
--digits=digits

出力ファイル名に含まれる数字の桁数を、デフォルトの 2 桁から digits 桁にする。

-k
--keep-files

エラーが起きても、出力ファイルを消去しない。

--suppress-matched

指定した pattern にマッチする行を出力しない。言い換えれば、 境界になる行が、分割されたファイルの 2 番目以降の断片の先頭に現れないようにする。 (訳注: pattern が正規表現の場合には、境界になる行がファイル中にたとえ 1 箇所しかなくても、 その行の表示を抑制するには、‘csplit --suppress-matched input pattern '{*}'’ などと、繰り返しの指定をする必要があるようだ。)

-z
--elide-empty-files

サイズ 0 の出力ファイルができないようにする (入力ファイルを各部分に区切る行が、 どの部分においても最初の行になることを期待している場合に、 このオプションを使わないと、一番目の出力ファイルがたいていサイズ 0 になる)。 このオプションが指定されているときでも、出力ファイルの連続番号が 0 から始まって、 順番に増えていくことに変わりはない。

-s
-q
--silent
--quiet

出力ファイルのサイズを表示しない。

終了ステータス 0 は成功を示し、0 以外の値は失敗を示す。

用例を挙げてみよう。まず、練習用に空のディレクトリを作って、そこに移動する。

 
$ mkdir d && cd d

次に、1 から 14 まで連続する数を、0 または 5 で終わる行で分割する。

 
$ seq 14 | csplit - '/[05]$/' '{*}'
8
10
15

ここで表示された各数字は、csplit が今作成した出力ファイルのサイズである。 その出力ファイルの名前をリストする。

 
$ ls
xx00  xx01  xx02

head を使って、内容を見る。

 
$ head xx*
==> xx00 <==
1
2
3
4

==> xx01 <==
5
6
7
8
9

==> xx02 <==
10
11
12
13
14

次の例では、入力を空行で分割している。

 
$ csplit --suppress-matched input.txt '/^$/' '{*}'

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

This document was generated on June 7, 2022 using texi2html 1.82.