如何使用unix脚本显示所有“n”字符长字符串组?

发布于 2024-09-09 10:32:23 字数 387 浏览 1 评论 0原文

这与另一个问题有关 - 代码高尔夫:重复的“颜色突出显示” text

我正在寻找一种将文件分成所有“n”个字符长组的方法。

例如:如果一个文件仅包含以下文本:

ABCDEFGHIJ

并且我们希望将其分成 3 组,则输出应为:

ABC
BCD
CDE
DEF
EFG
FGH
GHI
HIJ

文件中的字符不得与其他字符有任何区别。即,“空格”只是另一个应该遵循上述规则的字符......

This IS kind of linked to another question - Code golf: "Color highlighting" of repeated text

I'm tying to figure out a way of breaking a file into all 'n' characters long groups.

Eg: If a file comprises of ONLY the following text:

ABCDEFGHIJ

And we want it broken into sets of 3, the output should be:

ABC
BCD
CDE
DEF
EFG
FGH
GHI
HIJ

No characters in the file are to be treated any differently from another. ie, a "space" is just another character which should follow the rule above...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

绝對不後悔。 2024-09-16 10:32:23

sed:

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 版本。

sed:

echo "ABCDEFGHIJ" | sed -n ':a;/^...$/{p;b};s/.../&\n/;P;s/.//;s/\n//;ba'

A more generalized sed version:

num=5; echo "ABCDEFGHIJ" | sed -n ":a;/^.\{$num\}\$/{p;b};s/.\{$num\}/&\n/;P;s/.//;s/\n//;ba"

Bash and 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 (specifically 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)}'

Edit: Added a more generalized sed version and an AWK version.

我爱人 2024-09-16 10:32:23

它必须是基于 shell 的还是您对其他脚本语言持开放态度?这是 Python 版本:

width = 3
data = open("file").read()
for x in xrange(len(data) - width + 1):
    print data[x : x+width]

Does it have to be shell based or are you open to other scripting languages? Here's a version in Python:

width = 3
data = open("file").read()
for x in xrange(len(data) - width + 1):
    print data[x : x+width]
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文