ruby - BASH - 将多行字符串中的字符打乱

标签 ruby bash shuffle

我有一个具有以下结构的文件(filename.txt):

>line1
ABC
DEF
GHI
>line2
JKL
MNO
PQR
>line3
STU
VWX
YZ

我想打乱字符串中>开头的字符。输出(例如)如下所示:

>line1
DGC
FEI
HBA
>line2
JRP
OKN
QML
>line3
SZV
YXT
UW

这就是我尝试为每个 >line[number] 打乱字符的方法:ruby -lpe '$_ = $_.chars.shuffle * ""if !/^ >/' 文件名.txt.该命令有效(请参阅我的帖子 BASH - Shuffle characters in strings from file ),但它会逐行洗牌。我想知道如何修改命令以在每个 >line[number]all 字符串之间打乱字符。不要求使用 ruby

最佳答案

首先我们需要解决一个问题:如何将多行中的所有字符打乱:

echo -e 'ABC\nDEF\nGHI' |grep -o . |shuf |tr -d '\n'
GDAFHEIBC

并且,我们还需要一个数组来记录原始字符串中每一行的长度。

s=GDAFHEIBC
lens=(3 3 3)
start=0
for len in "${lens[@]}"; do
    echo ${s:${start}:${len}}
    ((start+=len))
done
GDA
FHE
IBC

因此,原点多行:

ABC
DEF
GHI

已改组至:

GDA
FHE
IBC

现在,我们可以做我们的工作了:

lens=()
string=""

function shuffle_lines {
    local start=0
    local shuffled_string=$(grep -o . <<< ${string} |shuf |tr -d '\n')
    for len in "${lens[@]}"; do
        echo ${shuffled_string:${start}:${len}}
        ((start+=len))
    done
    lens=()
    string=""
}

while read -r line; do
    if [[ "${line}" =~ ^\> ]]; then
        shuffle_lines
        echo "${line}"
    else
        string+="${line}"
        lens+=(${#line})
    fi
done <filename.txt

shuffle_lines

示例:

$ cat filename.txt
>line1
ABC
DEF
GHI
>line2
JKL
MNO
PQR
>line3
STU
VWX
YZ
>line4
0123
456
78
9
$ ./solution.sh
>line1
HFG
BED
AIC
>line2
JOP
KMQ
RLN
>line3
UVW
TYZ
XS
>line4
1963
245
08
7

关于ruby - BASH - 将多行字符串中的字符打乱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49596362/

相关文章:

python - 使用附加参数在本地执行远程 python 脚本

javascript - 创建一个 X 数量为一个字符的二维数组

java - 如何随机排列图像列表?

ruby-on-rails - 使用 Faker gem 生成相关的城市、邮政编码、国家代码值

ruby - 单个 Jekyll 网站中的多个博客

ruby - 为什么 sudo : bundle command not found?

从一副牌发牌的 Java 代码

ruby-on-rails - rake 数据库 :migrate issue postgresql

linux - chmod : missing operand after a+t

bash - 如何使 bash 命令定期运行?