将“split”实用程序的输出发送到标准输出

Send output from `split` utility to stdout

this question,我找到了 split 实用程序,它获取一个文件并将其分成大小均匀的块。默认情况下,它将这些块输出到新文件,但我想让它将它们输出到 stdout,用换行符(或任意定界符)分隔。这可能吗?

我试过了cat testfile.txt | split -b 128 - /dev/stdout

失败并出现错误 split: /dev/stdoutaa: Permission denied

查看帮助文本,似乎这告诉 split 使用 /dev/stdout 作为文件名的 前缀 ,而不是写入 /dev/stdout 本身.它不表示任何直接写入带有分隔符的单个文件的选项。有什么方法可以诱使 split 执行此操作,或者是否有其他实用程序可以实现我想要的行为?

不清楚您想做什么,但也许 split--filter 选项会有所帮助:

   --filter=COMMAND
          write to shell COMMAND; file name is $FILE

也许你可以直接使用它。例如,这将一次读取一个文件 10 个字节,通过 tr 命令传递每个块:

split -b 10 --filter "tr [:lower:] [:upper:]" afile

如果你真的想在 stdout 上发出一个流,它在块之间有分隔符,你可以这样做:

split -b 10 --filter 'dd 2> /dev/null; echo ---sep---' afile

如果 afile 是我当前目录中的一个文件,如下所示:

the quick brown fox jumped over the lazy dog.

那么上面的命令将导致:

the quick ---sep---
brown fox ---sep---
jumped ove---sep---
r the lazy---sep---
 dog.
---sep---

不,该实用程序不会向标准输出写入任何内容。它的 standard specification 具体说明未使用标准输出。

如果您使用 split,您需要连接创建的文件,在它们之间插入一个分隔符。

如果你只想在每 N 行插入一个分隔符,你可以使用 GNU sed:

$ sed '0~3a\-----\' file

每 3 行插入包含 ----- 的行。

来自信息页面: `--过滤器=命令' 使用此选项,而不是简单地写入每个输出文件, 通过管道写入每个指定的 shell COMMAND 输出文件。 COMMAND 应该使用 $FILE 环境变量, 每次调用都设置为不同的输出文件名 命令的。

split -b 128 --filter='cat ; echo ' inputfile

这是一种方法。您将把每个 128 个字符放入变量 "var"。

您可以使用您喜欢的分隔符进行打印或将其用于进一步处理。

#!/bin/bash

cat yourTextFile | while read -r -n 128 var  ; do
    printf "\n$var"
done

您可以在命令行下使用它:

while read -r -n 128 var  ; do printf "\n$var" ; done < yourTextFile

要将文件分成块,以换行符分隔,并写入标准输出,请使用 fold:

cat yourfile.txt | fold -w 128

...将在 128 个字符的 "chunks" 中写入标准输出。