>와 같은 문자열 내에서 "중복 문자"를 제거/교체하고 싶습니다.
입력하다,
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