Csplit:将文件分割为由上下文确定的片段

来自泡泡学习笔记
跳到导航 跳到搜索

csplit会创建一个或多个输出文件,其中包含输入的部分(如果输入为“-”,则为标准输入)。概要:

csplit [option]… input pattern…

输出文件的内容由模式参数确定,如下所述。如果模式参数引用输入文件中不存在的行(例如,如果没有剩余的行与给定的正则表达式匹配),则会发生错误。在匹配了每个模式之后,剩余的任何输入都将被复制到最后一个输出文件中。

默认情况下,csplit在创建每个输出文件后打印写入的字节数。

返回值为零表示成功,非零值表示失败。

模式参数的类型

'n'

创建一个输出文件,其中包含输入直到第n行(一个正整数)但不包括第n行。如果跟随一个重复计数,还会为输入文件的每个重复创建一个输出文件,其中包含下一个n行。

'/regexp/[offset]'

创建一个输出文件,其中包含当前行直到(但不包括)输入文件中包含正则表达式regexp的下一行。可选的偏移量是一个整数,可以以'+'或'-'开头。如果给定了偏移量,则将匹配行之前(不包括匹配行)加上或减去偏移量的输入放入输出文件中,并且之后的行开始输入的下一节。请注意,与regexp模式负偏移量之内的行不会与后续regexp模式匹配。

'%regexp%[offset]'

与前一种类型类似,不同之处在于它不会创建输出文件,因此忽略了输入文件的该部分。

'{repeat-count}'

重复之前的模式repeat-count次。repeat-count可以是正整数或星号,表示重复次数直到输入耗尽为止。

输出文件的名称由前缀(默认为'xx')和后缀组成。默认情况下,后缀是从'00'到'99'的两位十进制数字的递增序列。无论如何,按照文件名的排序顺序连接输出文件将产生原始输入文件,不包括使用%regexp%模式或–suppress-matched选项跳过的部分。

默认情况下,如果csplit遇到错误或接收到挂起、中断、退出或终止信号,它将在退出之前删除已创建的任何输出文件。

选项

'-f prefix'

'–prefix=前缀'

使用前缀作为输出文件名的前缀。

'-b format'

'–suffix-format=格式'

使用格式作为输出文件名的后缀。当指定此选项时,后缀字符串必须包含一个printf(3)样式的转换说明符,可能包括格式说明标志、字段宽度、精度说明或所有这些修饰符。格式字母必须将二进制无符号整数参数转换为可读形式。格式字母'd'和'i'是'u'的别名,并且允许使用'u'、'o'、'x'和'X'转换。将整个格式(包括当前输出文件编号)与sprintf(3)一起形成每个单独输出文件的文件名后缀。如果使用此选项,则忽略–digits选项。

'-n digits'

'–digits=数字'

使用数字长度为digits的数字作为输出文件名。而不是默认的2位数。

'-k'

'–keep-files'

在遇到错误时不删除输出文件。

'–suppress-matched'

不输出与指定模式匹配的行。即从第二个及后续分割的开始边界行中删除。

'-z'

'–elide-empty-files'

不生成零长度的输出文件。(在输入文件的节定界符应该标记每个节的第一行的情况下,除非使用此选项,否则第一个输出文件通常是零长度的文件。)即使指定了此选项,输出文件的序号始终连续从0开始。

'-s'

'-q'

'–silent'

'–quiet'

不打印输出文件大小的计数。

使用示例。

  1. 首先,创建一个空目录并进入该目录:

     $ mkdir d && cd d
  2. 现在,将以0或5结尾的1..14序列拆分成多行:

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

    上面打印的每个数字都是csplit刚刚创建的输出文件的大小。

  3. 列出这些输出文件的名称:

     $ ls
     xx00  xx01  xx02
  4. 使用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 '/^$/' '{*}'