文字列内で繰り返される文字の検索と置換

文字列内で繰り返される文字の検索と置換

>のような文字列内で「重複文字」を削除/交換したいです。

入力する、

staaacksoveerfloow

希望の出力、

stacksoverflow

この場合はa3回を繰り返します。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}\wman pcrepattern

関連情報