所以我有这个功能,输出如下:
AGsg4SKKs74s62#
我需要找到一种方法来加扰字符而不删除任何东西。所有字符必须在我加扰之后出现。
我只能打包包括awk和sed的实用程序。
答案 0 :(得分:7)
echo 'AGsg4SKKs74s62#' | sed 's/./&\n/g' | shuf | tr -d "\n"
输出(例如):
S7s64#2gKAGsKs4
答案 1 :(得分:4)
这是一个完成工作的纯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
看起来没事。
答案 2 :(得分:3)
我知道你还没有提到过Perl,但可以这样做:
perl -MList::Util=shuffle -F'' -lane 'print shuffle @F' <<<"AGsg4SKKs74s62#"
-a
启用自动拆分模式,-F''
将字段分隔符设置为空字符串,因此每个字符都进入一个单独的数组元素。使用核心模块List::Util
提供的函数对数组进行混洗。
答案 3 :(得分:0)
这是我的解决方案,用法: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"
}