>のような文字列内で「重複文字」を削除/交換したいです。
入力する、
staaacksoveerfloow
希望の出力、
stacksoverflow
この場合はa
3回を繰り返します。e
は2&o
は2です。完全に削除するのではなく、重複/重複エントリを削除します。
ただし、その文字が前後に繰り返されない場合は重複排除されません。
答え1
$ tr -s '[:lower:]' <<<"staaacksoveerfloow"
stacksoverflow
tr
このユーティリティとその-s
オプションは、指定された文字列から連続した重複小文字を削除するために使用されます。
[:lower:]
a-z
代わりに、影響を与えたい文字に一致する範囲または文字クラスを使用できます。
答え2
sedを使用してこれを実行できます。
echo staaacksoveerfloow | sed 's/\([a-zA-Z]\)\1\+/\1/g'
問題は重複した状態ではなく、重複した状態のようです。もっと参考にしてくださいここ
答え3
存在するksh93
:
$ var=staaacksoveerfloow
$ print -r -- "${var//@(?)+(\1)/\1}"
stacksoverflow
(重複排除を特定の文字カテゴリに制限するには、/...?
に置き換えます。)[[:alpha:]]
[[:lower:]]
存在するzsh
:
$ autoload -Uz regexp-replace
$ set -o rematchpcre
$ var=staaacksoveerfloow
$ regexp-replace var '(.)\1+' '$match[1]'
$ print -r -- $var
stacksoverflow
もう一度/(POSIX文字クラス)またはPCRE属性(たとえば、ラテンスクリプト文字(英語で使用される文字など)に制限)または....
に置き換えます。詳しくはこちらをご覧ください。[[:alpha:]]
[[:lower:]]
\p{Latin}
\w
man pcrepattern