这有点链接到另一个问题 -代码高尔夫:重复文本的“颜色突出显示”
我想找出一种将文件分成所有“n”个字符长组的方法。
例如:如果文件仅包含以下文本:
ABCDEFGHIJ
我们希望它分成 3 组,输出应该是:
ABC
BCD
CDE
DEF
EFG
FGH
GHI
HIJ
文件中的任何字符都不会被区别对待。即,“空格”只是另一个应该遵循上述规则的字符......
这有点链接到另一个问题 -代码高尔夫:重复文本的“颜色突出显示”
我想找出一种将文件分成所有“n”个字符长组的方法。
例如:如果文件仅包含以下文本:
ABCDEFGHIJ
我们希望它分成 3 组,输出应该是:
ABC
BCD
CDE
DEF
EFG
FGH
GHI
HIJ
文件中的任何字符都不会被区别对待。即,“空格”只是另一个应该遵循上述规则的字符......
赛德:
echo "ABCDEFGHIJ" | sed -n ':a;/^...$/{p;b};s/.../&\n/;P;s/.//;s/\n//;ba'
更通用的sed
版本:
num=5; echo "ABCDEFGHIJ" | sed -n ":a;/^.\{$num\}\$/{p;b};s/.\{$num\}/&\n/;P;s/.//;s/\n//;ba"
Bash 和 ksh:
string="ABCDEFGHIJ"
for ((i=0;i<=${#string}-3;i++)); do echo ${string:i:3}; done
zsh:
string="ABCDEFGHIJ"
for ((i=1;i<=${#string}-2;i++)); do echo $string[i,i+2]; done
sh(特别是 Dash):
string='ABCDEFGHIJ'
count=$(seq $((${#string}-2)))
for i in $count; do b="$b?"; done
for i in $count; do b="${b%?}"; echo "${string%$b}"; string="${string#?}"; done
AWK:
echo "ABCDEFGHIJ" | awk -v num=4 '{for (i=1; i<length($0)-num;i++) print substr($0,i,num)}'
编辑:添加了更通用sed
的版本和 AWK 版本。
它必须是基于 shell 的还是你对其他脚本语言开放?这是 Python 中的一个版本:
width = 3
data = open("file").read()
for x in xrange(len(data) - width + 1):
print data[x : x+width]