文字が連続して表示される頻度を確認する[閉じる]

文字が連続して表示される頻度を確認する[閉じる]

(Bashでは)文字の連続的な発生を確認する方法が必要ですが、文字を2番目の変数として扱う前に発生回数を制限して、より大きなセットが最初に表示されるようにする必要があります。たとえば、バイナリ文字があり、次のことができるスクリプトが必要であるとします。

01111100

次のように報告されています

03200

または

01001111

〜のように

010031

または

01011001

〜のように

0102001

お願いしますいいえ、bashシェルに入る唯一の方法でなければ。

ベストアンサー1

Perlが気に入らなければできます。

  • 1シーケンスの単一の0または1〜3インスタンスに一致します。

  • ゼロを自分にマッピングし、シーケンスを長さにマップします。

例えば

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

おすすめ記事