String Bash-字符串中包含的加扰字符

String Bash-字符串中包含的加扰字符,string,bash,awk,character,scramble,String,Bash,Awk,Character,Scramble,因此,我有一个具有以下输出的函数: AGsg4SKKs74s62# 我需要找到一种在不删除任何内容的情况下对字符进行置乱的方法。也就是说,在我对字符进行置乱后,所有字符都必须存在 我只能使用bash工具,包括awk和sed echo 'AGsg4SKKs74s62#' | sed 's/./&\n/g' | shuf | tr -d "\n" 输出(例如): 我知道您没有提到Perl,但可以这样做: perl -MList::Util=shuffle -F'' -lane '

因此,我有一个具有以下输出的函数:

    AGsg4SKKs74s62#
我需要找到一种在不删除任何内容的情况下对字符进行置乱的方法。也就是说,在我对字符进行置乱后,所有字符都必须存在

我只能使用bash工具,包括awk和sed

echo 'AGsg4SKKs74s62#' | sed 's/./&\n/g' | shuf | tr -d "\n"
输出(例如):


我知道您没有提到Perl,但可以这样做:

perl -MList::Util=shuffle -F'' -lane 'print shuffle @F' <<<"AGsg4SKKs74s62#"

perl-MList::Util=shuffle-F''-lane'print shuffle@F'下面是一个执行此任务的纯Bash函数:

scramble() {
    # $1: string to scramble
    # return in variable scramble_ret
    local a=$1 i
    scramble_ret=
    while((${#a})); do
        ((i=RANDOM%${#a}))
        scramble_ret+=${a:i:1}
        a=${a::i}${a:i+1}
    done
}
看看它是否有效:

$ scramble 'AGsg4SKKs74s62#'
$ echo "$scramble_ret"
G4s6s#2As74SgKK

看起来不错。

这是我的解决方案,用法:
shuffleString“anystring”
。在使用bash时,我不考虑性能

function shuffleString() {
    local line="$1"
    for i in $(seq 1 ${#line}); do
        local p=$(expr $RANDOM % ${#line})
        if [[ $p -lt $i ]]; then
            local line="${line:0:$p}${line:$i:1}${line:$p+1:$i-$p-1}${line:$p:1}${line:$i+1}"
        elif [[ $p -gt $i ]]; then
            local line="${line:0:$i}${line:$p:1}${line:$i+1:$p-$i-1}${line:$i:1}${line:$p+1}"
        fi
    done
    echo "$line"
}

如果有单词,我们怎么把单词混在一起,而不把单词分解成字符呢?
function shuffleString() {
    local line="$1"
    for i in $(seq 1 ${#line}); do
        local p=$(expr $RANDOM % ${#line})
        if [[ $p -lt $i ]]; then
            local line="${line:0:$p}${line:$i:1}${line:$p+1:$i-$p-1}${line:$p:1}${line:$i+1}"
        elif [[ $p -gt $i ]]; then
            local line="${line:0:$i}${line:$p:1}${line:$i+1:$p-$i-1}${line:$i:1}${line:$p+1}"
        fi
    done
    echo "$line"
}