중복 문자를 제거하는 방법?


18

내가 다음과 같은 줄을 가지고 있다면 :

Thhiisss iisss mmyyy nameeee

이것을 다음과 같이 인쇄하고 싶습니다 :

This is my name

이것에 대한 유닉스 명령은 무엇입니까?


중복의 원점과 원하는 결과에 대해 더 많은 컨텍스트를 제공 할 수 있습니까? "Mimyyy nameee iisss Jesssssiiieee"는 어떻게됩니까?
Paulo Almeida

답변:


24

tr:

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

설명 : "압착" -s스위치가 tr문자를 반복합니다. 그림과 같이 스위치를 문자 범위 : a~ 로 사용할 수 있습니다 z.


2
이 명령에 대한 설명은 향후 독자에게 도움이 될 수 있습니다.
Geek

8

GNU 시스템 sed에서는 GNU 가 바이트 당 문자 만 참조 할 수 있기 때문에 로케일이 멀티 바이트 문자 ( jimmij에서 제안한대로 )를 사용하는 경우 이와 유사하거나 비슷해야합니다 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

7

한 가지 방법으로 sed:

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

또는 더 간단합니다.

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

(감사 코스타스mikeserv 의견).


sed 's/\(.\)\1\+/\1/g'
Costas

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.