我想转换
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...
到
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'
给出
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命令将长的(可能是无限的)输入字符串拆分成行?
答案 0 :(得分:9)
fold
可以成为你的朋友:
$ fold -w 80 file
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
...
$ fold -w 20 file
Hello.Hello.Hello.He
llo.Hello.Hello.Hell
o.Hello.Hello.Hello.
Hello.Hello.Hello.He
llo.Hello.Hello.Hell
o.Hello.Hello.Hello.
Hello.Hello.Hello.He
llo.Hello.Hello.Hell
o.Hello.Hello.Hello.
Hello.Hello.Hello.He
llo.Hello.Hello.Hell
o.Hello.Hello.Hello.
Hello.Hello.Hello.He
llo.Hello.Hello.Hell
o.Hello.Hello.Hello.
Hello.Hello.Hello.He
...
来自man fold
:
fold - 将每个输入行换行以适合指定的宽度
-w , - width = WIDTH
使用WIDTH列而不是80
因此实际上fold file
与fold -w 80 file
答案 1 :(得分:6)
你可以使用perl one liner,
perl -lpe 'BEGIN{ $/ = \80 }' file
$ /
输入记录分隔符,默认为换行符。 [..]将 $ / 设置为对整数的引用,包含整数的标量或可转换为整数的标量将尝试读取记录而不是行,具有最大记录size是引用的整数字符数
答案 2 :(得分:0)
您也可以尝试下面的perl代码,
$ perl -0777pe 's/(.{80})/\1\n/g' file
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
...
答案 3 :(得分:0)
尝试选项-u
-u( - unbuffered)
尽可能减少输入和输出的缓冲。 (如果输入来自'tail -f'之类,并且您希望尽快看到转换后的输出,则此功能特别有用。)
sed -u 's/\(.\{5\}\)/\1\'$'\n/g'