![检查字符连续出现的频率](https://linux22.com/image/90040/%E6%A3%80%E6%9F%A5%E5%AD%97%E7%AC%A6%E8%BF%9E%E7%BB%AD%E5%87%BA%E7%8E%B0%E7%9A%84%E9%A2%91%E7%8E%87.png)
我需要一种方法(在 Bash 中)来检查字符的连续出现,但是在将其视为第二个变量之前,它还需要能够有出现次数的限制,这样较大的集合就会首先出现。例如,假设我有一封二进制字母,我需要脚本能够执行以下操作:
01111100
报告为
03200
或者
01001111
作为
010031
或者
01011001
作为
0102001
请没有 awk,除非它确实是 bash shell 中唯一可行的方法
答案1
如果你不介意 perl,你可以
匹配单个 0 或 1 到 3 个 1 序列的实例
将零映射到它们自身,并将个序列映射到它们的长度
例如
perl -lne '@runs = $_ =~ /(0|1{1,3})/g; print map { $_==0 ? $_ : length $_ } @runs'
使用提供的字符串进行测试:
cat << EOF | \
perl -lne '@runs = $_ =~ /(0|1{1,3})/g; print map { $_==0 ? $_ : length $_ } @runs'
01111100
01001111
01011001
EOF
输出
03200
010031
0102001
如果 perl 不是一个选项,您可以使用其他正则表达式工具执行相同的操作,例如使用 grep 和 bash 数组
mapfile -t runs < <(echo '01111100' | grep -Eo '0|1{1,3}')
然后
for r in "${runs[@]}"; do ((r == 0)) && printf '0' || printf '%d' "${#r}"; done; printf '\n'
03200