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

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

    AGsg4SKKs74s62#

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

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

【问题讨论】:

    标签: string bash awk character scramble


    【解决方案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"
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-12-07
          • 2019-06-03
          • 1970-01-01
          • 2015-06-30
          • 1970-01-01
          • 2019-02-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多