包含在字符串中的 Bash-scramble 字符

Posted

技术标签:

【中文标题】包含在字符串中的 Bash-scramble 字符【英文标题】:Bash- scramble characters contained in a string 【发布时间】:2014-12-07 05:01:06 【问题描述】:

所以我有这个函数,输出如下:

    AGsg4SKKs74s62#

我需要找到一种方法来打乱字符而不删除任何内容。也就是说,在我打乱它们之后,所有字符都必须存在。

我只能 bash 实用程序,包括 awk 和 sed。

【问题讨论】:

【参考方案1】:
echo 'AGsg4SKKs74s62#' | sed 's/./&\n/g' | shuf | tr -d "\n"

输出(例如):

S7s64#2gKAGsKs4

【讨论】:

如果有单词,我们如何将单词打乱而不将单词分解成字符?【参考方案2】:

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

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

-a 启用自动拆分模式,-F'' 将字段分隔符设置为空字符串,因此每个字符都进入一个单独的数组元素。使用核心模块List::Util提供的函数对数组进行洗牌。

【讨论】:

【参考方案3】:

这是一个可以完成这项工作的纯 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

看起来不错。

【讨论】:

【参考方案4】:

这是我的解决方案,用法:shuffleString "any-string"。使用 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"

【讨论】:

以上是关于包含在字符串中的 Bash-scramble 字符的主要内容,如果未能解决你的问题,请参考以下文章

检查字符串是不是包含 Velocity 中的特定子字符串

如何检查字符串是不是已包含 Swift 中的字符 [重复]

无法确定字符串是不是包含数组中的单词

从包含在字符串中的 XML 获取值

如何检查一个字符串数组是不是包含 JavaScript 中的一个字符串? [复制]

在包含列表中的字符串的数据框中搜索一行