Bash字符串处理(索引处的字符和连接)

4

我正在学习bash字符串处理。

如何编写一个等价于以下Java代码片段的bash脚本?

String symbols = "abcdefg12345_";
for (char i : symbols.toCharArray()) {
    for (char j : symbols.toCharArray()) {
        System.out.println(new StringBuffer().append(i).append(j));
    }
}

以上代码片段的输出以以下内容开头:
aa
ab
ac
ad
ae
af

并以以下内容结束:

_g
_1
_2
_3
_4
_5
__

我的目标是列出允许使用的字符列表(不一定是上述字符),并打印出所有长度为2的排列组合。如果可能,我希望解决方案仅依赖于Bash,不需要安装任何其他工具。
编辑:还有一个小问题跟进:是否有办法在没有空格分隔子字符串的情况下使用字符串进行此操作?例如LIST="abcdef12345_"?
4个回答

6

这很简单,Bash 在输入解析器中处理。不需要代码。试试:

echo {a,b,c,d,e,f,g,1,2,3,4,5,_}{a,b,c,d,e,f,g,1,2,3,4,5,_}

你可能需要进行第二次处理,将其分成几行。

或者,你当然可以像示例中那样使用几个嵌套循环:

LIST="a b c d e f 1 2 3 4 5 _";
for a in $LIST ; do
    for b in $LIST ; do
        echo $a$b;
    done;
done

echo的输出管道传输到sed -e 's|\ |\n|g'可以在第一个示例上起到将输出拆分成多行的作用。 - Ken Gentle
@Ken G: 很棒的补充!@unwind: 虽然我很喜欢第一个例子,但我选择了第二个作为我的答案,因为它让我只在一个地方维护列表,并且没有使用 Sed(虽然大多数地方都有,但不是每个地方都有),就能正确换行。 - user14070
只是一个小的后续问题:是否有一种方法可以使用没有空格分隔子字符串的字符串来完成这个操作?例如LIST="abcdef12345_"? - user14070

0

一行完美适配:

 for i in `echo {a,b,c,d,e,f,g,1,2,3,4,5,_}{a,b,c,d,e,f,g,1,2,3,4,5,_}`; do echo $i; done

0

这只是一些关于如何拆分生成的项目的变化。个人而言,我喜欢使用tr来完成这项工作。

echo {a,b,c,d,e,f,g,1,2,3,4,5,_}{a,b,c,d,e,f,g,1,2,3,4,5,_} | tr " " "\n"

0
for i in a b c d e f g 1 2 3 4 5 _; do
    for j in a b c d e f g 1 2 3 4 5 _; do
        echo $i$j
    done
done

man bash 是你的好朋友。它有很多关于变量替换和内部命令的章节。


虽然bash手册是我的好朋友,但如果你不知道你要找什么,我发现它有点长(约4900行)浏览起来有些困难。在这种情况下,我经常会在Google上搜索教程,如果那也不能帮助我,我就会尝试在这里提问。 - user14070
是的,这个 man 页面非常庞大。但我建议至少跳过一次章节标题,这样你至少知道里面有什么内容。如果需要的话,你随时可以回来再读更多。 - Bombe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接