중복 문자를 제거하는 방법은 무엇입니까?

중복 문자를 제거하는 방법은 무엇입니까?

줄이 있는 경우:

Thhiisss iisss mmyyy nameeee

다음과 같이 인쇄하고 싶습니다.

This is my name

유닉스 명령이란 무엇입니까?

답변1

그리고 tr:

echo "Thhiisss iisss mmyyy nameeee" | tr -s 'a-z'

설명: 반복되는 문자를 "압착"하는 스위치입니다 -s. tr표시된 대로 이 스위치는 일련의 문자( ato ) 와 함께 사용할 수 있습니다 z.

답변2

한 가지 방법은 다음과 같습니다 sed.

sed ':X;s/\(.\)\1/\1/g;tX'

훨씬 더 간단합니다:

sed 's/\(.\)\1*/\1/g'

(감사해요코스타스그리고맥사이프의견을 위해).

답변3

sedGNU 시스템에서 로케일이 멀티바이트 문자를 사용하는 경우 또는 이와 유사한 명령을 사용해야 합니다.(지미가 제안한대로)GNU는 tr바이트당 하나의 문자만 참조할 수 있기 때문입니다. ASCII 로케일에서는 다음을 제거할 수 있습니다.모두예를 들면 다음과 같습니다 tr.

LC_ALL=C tr -s '\0-\255' <input

그래서...

echo Thhiisss iisss mmyyy nameeee|
LC_ALL=C tr -s '\0-\255'

...인쇄...

This is my name

범위별로 대상을 참조하여 선택적으로 이 작업을 수행할 수도 있습니다.

echo TThhiisss iisss mmyyy nameeee|
LC_ALL=C tr -s '\101-\132'

...또는...

echo TTTThhiisss iisss mmyyy nameeee|
LC_ALL=C tr -s '[:upper:]'

...결과는 동일하며 둘 다 인쇄됩니다.

Thhiisss iisss mmyyy nameeee

...또는 [:punct:], [:digit:]또는 원하는 것을 [:lower:]사용 하세요. [:alpha:]다음을 사용하여 선택을 무효화할 수도 있습니다 -c.

echo 'TTTThhiisss     iisss mmyyy nameeee' |
LC_ALL=C tr -cs '[:upper:]'

...인쇄...

TTTThis is my name

답변4

echo "Thhiisss iisss mmyyy nameeee" | grep -o . | uniq | tr -d '\n'

관련 정보