所以,我使用 bash 来读取一个文件(没有换行符、空格或制表符)。
像这样的东西:
aababcbbcbckqkkqkqhddhkehkjhqkjhsdk
skjhqkdjhqkzdhkzhdkjqzhdhqkjhzdkqzh
虽然这个例子中有一个换行符,但我正在处理的数据上没有……所以我发现,因为从技术上讲,所有内容都被视为在“同一行”上(因为没有任何换行符或我可以使用任何分隔符),我尝试读取每 N 个字符:
while read -N129999 character; do
program "$character"
done < <(cat file | tr -d '\n')
(我知道“猫的无用用途”)
我在这里使用的数字只是我发现可以read
使用的最大值(我也更喜欢这样做,因为它可以更快地处理文件)program
这里只是一个示例,仅供说明之用。我故意删除了上述数据上的换行符、制表符和空格。
现在,虽然我提供的内容有效,但它对于文件的最后部分不太有效,其中包含的数字少于上述数字……虽然我知道,如果向 提供了分隔符IFS
,则 -n之后选项可以继续,而不是忽略不适合字符范围的文件的其余部分...
我如何(在 bash、sed 或任何 posix 工具中?)读取每 N 个范围的字符,同时包括不适合该范围的文件/输入的其余部分?
答案1
在读取最后一行末尾缺少换行符的文本文件时,您会遇到同样的问题。read
当它在看到分隔符之前到达文件末尾时,或者在此处未读取所需数量的字符时,返回虚假状态。也就是说,即使它确实读取了某物在那之前。但它确实设置了输出变量,因此您可以检查它是否非空。
$ printf abc | while read -N2 x || [ "$x" ] ; do echo "read: $x"; done ;
read: ab
read: c
如果没有该条件,您仍然可以在循环退出后看到输入的最后部分出现在输出变量中。
$ printf abc | ( while read -N2 x; do echo "read: $x"; done ; echo "finally: $x" )
read: ab
finally: c