如何使用固定数量的字符在bash中读取文件?

Nor*_*tfi 1 shell scripting bash

因此,我使用 bash 读取文件(没有换行符、空格或制表符)。

像这样的东西:

aababcbbcbckqkkqkqhddhkehkjhqkjhsdk
skjhqkdjhqkzdhkzhdkjqzhdhqkjhzdkqzh
Run Code Online (Sandbox Code Playgroud)

虽然在这个例子中有一个换行符,但我正在处理的数据上没有......所以我发现了这一点,因为从技术上讲,一切都被视为“同一行”(因为没有任何换行符或我可以使用的任何分隔符),我尝试读取每个第 N 个字符:

aababcbbcbckqkkqkqhddhkehkjhqkjhsdk
skjhqkdjhqkzdhkzhdkjqzhdhqkjhzdkqzh
Run Code Online (Sandbox Code Playgroud)

(我知道“猫的无用使用”)

我在这里使用的数字只是我发现我可以read使用的最大值(我也更喜欢这样做,因为它可以更快地处理文件)program这里只是一个例子,为了说明。我故意删除上述数据上的换行符、制表符和空格。

现在,虽然我提供的内容有效,但它对文件的最后部分并不完全有效,其中包含的数字少于上述数字……虽然我知道,如果提供给 的分隔符IFS,则 -n选项可以在此之后继续,而不是忽略不适合字符范围的文件的其余部分...

我如何(在 bash、sed 或任何 posix 工具中?)读取每个第 N 个字符范围,同时包括不适合该范围的文件/输入的其余部分?

ilk*_*chu 5

在阅读最后一行末尾缺少换行符的文本文件时,您会看到同样的问题。read当它在看到分隔符之前或此处未读取所需数量的字符时遇到文件结尾时返回错误状态。也就是说,即使它在此之前确实阅读了一些内容。不过它确实设置了输出变量,因此您可以检查它是否为非空。

$ printf abc | while read -N2 x || [ "$x" ] ; do echo "read: $x"; done ;
read: ab
read: c
Run Code Online (Sandbox Code Playgroud)

如果您没有那个条件,您仍然可以看到输入的最后一部分出现在输出变量中,就在循环退出之后。

$ printf abc | ( while read -N2 x; do echo "read: $x"; done ; echo "finally: $x" )
read: ab
finally: c
Run Code Online (Sandbox Code Playgroud)

相关:什么是`while read -r line || [[ -n $line ]]` 是什么意思?