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'
不打印输出文件大小的计数。
使用示例。
首先,创建一个空目录并进入该目录:
$ mkdir d && cd d
现在,将以0或5结尾的1..14序列拆分成多行:
$ 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 '/^$/' '{*}'