我想转换
Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.He...
to
Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.He
llo.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hell
o.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.
Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.Hello.He
...,
其中宽度为 80 个字符。
我首先认为我可以使用sed
。 (让我解释一下5
字符而不是80
字符来澄清。)
echo "longlonglonglonglonglonglonglonglonglonglonglong" | sed 's/\(.\{5\}\)/\1\'$'\n/g'
gives
longl
onglo
nglon
glong
longl
onglo
nglon
glong
longl
ong
如我所愿。但是,当输入字符串永远持续时,我无法使用这种方式。
while true; do; echo -n "Hello."; done | sed 's/\(.\{5\}\)/\1\'$'\n/g'
上面的命令不起作用。我也尝试过使用perl
,但徒劳无功。 (perl -pe 's/(.{5})/$1\n/g'
)
所以我放弃了在unix命令中求解并用C编写了一个小程序。
#include <stdio.h>
int main(int argc, char *argv[]) {
int i = 0, ch;
while ((ch = fgetc(stdin)) != EOF) {
putchar((char)ch);
i += 1;
if (ch == '\n') {
i = 0;
}
if (i >= 80) {
printf("\n");
i = 0;
}
}
return 0;
}
该程序对我来说效果很好。所以问题是,如何使用 unix 命令将很长(可能是无限)的输入字符串分割成行?