将“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" 中写入标准输出。
从 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" 中写入标准输出。