Regex for循环:逐步截断右侧的字符串

Regex for循环:逐步截断右侧的字符串,regex,bash,for-loop,Regex,Bash,For Loop,我不想修剪每个第一个字母的第一个字母,而是修剪最后一个字母,创建如下输出: Foo bar sells drinks oo bar sells drinks o bar sells drinks bar sells drinks bar sells drinks ar sells drinks r sells drinks sells drinks sells drinks ells drinks lls drinks ls drinks s drinks drinks drinks rinks

我不想修剪每个第一个字母的第一个字母,而是修剪最后一个字母,创建如下输出:

Foo bar sells drinks
oo bar sells drinks
o bar sells drinks
bar sells drinks
bar sells drinks
ar sells drinks
r sells drinks
sells drinks
sells drinks
ells drinks
lls drinks
ls drinks
s drinks
drinks
drinks
rinks
inks
nks
ks
s

如下所示,将负长度用作第二个参数:

Foo bar sells drinks
Foo bar sells drink
Foo bar sells drin
Foo bar sells dri
etc.
此代码的作用是:

从整个字符串的大小向后计数到0,给出从字符串开头开始的字符数。

不计算字符数

#!/bin/bash

WholeWord="Foo bar sells drinks"
for (( character=${#WholeWord}; character>0; --character )); do
    echo ${WholeWord:0:$character}
done

对于几乎所有shell,请使用此脚本。 每次打印完字符串后只需切掉一个字符:

$ foo="Foo bar sells drinks"
$ while [[ ! -z $foo ]]; do echo $foo; foo=$(sed 's/.$//' <<< $foo); done

Foo bar sells drinks
Foo bar sells drink
Foo bar sells drin
Foo bar sells dri
Foo bar sells dr
Foo bar sells d
Foo bar sells
Foo bar sell
Foo bar sel
Foo bar se
Foo bar s
Foo bar
Foo ba
Foo b
Foo
Fo
F
或者,如果必须使用子字符串展开,则在每个步骤上使长度减小到1:

#!/bin/sh
WholeWord="Foo bar sells drinks"
foo="$WholeWord"

while [ "$foo" ]; do
    printf '%s\n' "$foo"
    foo="${foo%?}"
done

你可能想链接到参考资料:嗨,阿努巴瓦先生,谢谢你的回答,我将把@amphetamachine的答案标记为已解决的答案,因为他的答案没有省略第一行。我想把它作为循环的一部分,因此我必须使用他的方法哦,这就是你减法的方式。。我试着做一个角色-@TuxForLife角色-,只要它在游戏中就行了-foo是我养成的一个老习惯,因为它传统上是一种更快的操作。我相信你可能知道,但是:你应该使用/bin/bash作为she-bang,因为sh没有for循环或子字符串扩展。正如binaryZebra所演示的,没有理由为每个字符调用sed,shell的内置参数扩展可以处理它。
$ foo="Foo bar sells drinks"
$ while [[ ! -z $foo ]]; do echo $foo; foo=$(sed 's/.$//' <<< $foo); done

Foo bar sells drinks
Foo bar sells drink
Foo bar sells drin
Foo bar sells dri
Foo bar sells dr
Foo bar sells d
Foo bar sells
Foo bar sell
Foo bar sel
Foo bar se
Foo bar s
Foo bar
Foo ba
Foo b
Foo
Fo
F
#!/bin/sh
WholeWord="Foo bar sells drinks"
foo="$WholeWord"

while [ "$foo" ]; do
    printf '%s\n' "$foo"
    foo="${foo%?}"
done
WholeWord="Foo bar sells drinks"

for (( character=${#WholeWord}; character>0; character-- )); do
    printf '%s\n' "${WholeWord:0:$character}"
done
Foo bar sells drinks
Foo bar sells drink
Foo bar sells drin
Foo bar sells dri
Foo bar sells dr
Foo bar sells d
Foo bar sells 
Foo bar sells
Foo bar sell
Foo bar sel
Foo bar se
Foo bar s
Foo bar 
Foo bar
Foo ba
Foo b
Foo 
Foo
Fo
F