合并和拆分,在 bash 中使用 csplit

Merge and split, using csplit in bash

我正在合并三个三个文件 (ls -l):

-rw-rw-r-- 1 kacper kacper 1839510 sie 13 14:27 A.jpg
-rw-rw-r-- 1 kacper kacper 2014809 sie 13 14:27 B.jpg
-rw-rw-r-- 1 kacper kacper 1277047 sie 13 14:27 C.pdf

到 bash 中的一个文件(合并)使用:

cat A.jpg >> merged 
echo $SEPARATOR >> merged 
cat B.jpg >> merged 
echo $SEPARATOR >> merged 
cat C.pdf >> merged

其中:

SEPARATOR=PO56WLH82SN1ZS5QH5EU9FOZVLBRLHAGHO3D5KOUSPMS6KYSFAYN2DBL

接下来我将合并后的文件分成三个部分:

csplit --suppress-matched merged --prefix="PART_" '/'$SEPARATOR'/' {*}

这会产生 PART_00、PART_01、PART_02 (ls -l):

-rw-rw-r--  1 kacper kacper 1839398 sie 13 18:41 PART_00
-rw-rw-r--  1 kacper kacper 2014507 sie 13 18:41 PART_01
-rw-rw-r--  1 kacper kacper 1277047 sie 13 18:41 PART_02

PART_00和PART_01为JPG文件,可以正常显示。 PART_02为PDF文件,可以打开查看。所以,乍一看,这在我看来是成功的。

问题是 PART_00(1839398 字节)的大小比 A.jpg(1839510 字节)稍小。其他文件(PART_01、B.jpg 和 PART_02、C.pdf)也是如此。使用

逐字节检查文件后
cmp

直到其中一个文件结束时,这两对文件完全相同。

有人知道为什么会这样吗?将不胜感激。

文件中的最后几行没有以换行符结尾。因此,当您将分隔符添加到合并文件中时,您就是将其添加到文件最后一行的末尾。最后一行然后与 csplit 匹配,整行都被删除了。因此,最后几个字符被删除。

csplit--supress-matched 选项将抑制匹配模式的 整个 行匹配。