gpt4 book ai didi

linux - 使用 BASH 最多排列 N 个字母

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:43:35 28 4
gpt4 key购买 nike

我想使用 bash 脚本生成给定字符串的 N 个字母排列

我已经成功编写了一段代码来查找给定单词的排列。但是,我似乎无法得到最多 N 个字母的排列。注意:我必须避免使用 sed 和 awk 命令。这是我尝试过的:

#!/bin/bash
x=$1
counter=0
ARRAY=()
function permutate {
if [ "${#1}" = 1 ]; then
echo "${2}${1}"
ARRAY+=("${2}${1}")
else
for i in $(seq 0 $((${#1}-1)) ); do
pre="${2}${1:$i:1}"
seg1="${1:0:$i}"
seg2="${1:$((i+1))}"
seg="${seg1}${seg2}"
permutate "$seg" "$pre"
done
fi
}
permutate $x

例如,如果我有一个单词“JACK”并且我想要 3 个字母的排列,那么它应该给出:江淮汽车开建航空 jack ETC...但我似乎无法追根究底。

最佳答案

字母的排列可以通过大括号扩展获得。示例:

$ echo {A,B}{A,B}
AA AB BA BB

所以我们的想法是稍微利用这个大括号扩展。假设您有一个字符串 str,那么您可以获得一个大括号展开式:

$ str="JACK"
$ eval echo "{$(echo "$str" | fold -w1 | paste -sd,)}"
J A C K

您可以逐步了解它的作用:

$ echo "$str" | fold -w1 | paste -sd,
J,A,C,K
  • fold -w1$str$ 的每个字符放在一行上
  • paste -sd, 将所有行合并为一行,中间用逗号分隔。

我们需要这种组合,因为我们不能使用 sedeval 命令最终会强制展开大括号。

现在的关键是重复大括号扩展 n 次。为此,我们使用 printf。如果您有一个字符串 "foo",您可以按以下方式使用 printf 重复它 n 次:

$ printf "foo%.0s" {1..3}
foofoofoo

因此,所有有重复的排列都可以找到:

$ str="JACK"
$ n=3
$ bracestring=$(printf "{$(echo "$str" | fold -w1 | paste -sd,)}%.0s" $(seq 1 $n))
$ eval echo $bracestring
JJJ JJA JJC JJK JAJ JAA JAC JAK JCJ JCA JCC JCK JKJ JKA JKC JKK AJJ AJA AJC AJK AAJ AAA AAC AAK ACJ ACA ACC ACK AKJ AKA AKC AKK CJJ CJA CJC CJK CAJ CAA CAC CAK CCJ CCA CCC CCK CKJ CKA CKC CKK KJJ KJA KJC KJK KAJ KAA KAC KAK KCJ KCA KCC KCK KKJ KKA KKC KKK

关于linux - 使用 BASH 最多排列 N 个字母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55995515/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com