我有一个具有以下结构的文件(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/