Як видалити повторювані символи?


18

Якщо у мене є рядок як:

Thhiisss iisss mmyyy nameeee

Я хочу надрукувати це як:

This is my name

Яка для цього команда unix?


Чи можете ви надати ще якийсь контекст щодо походження дублікатів та бажаного результату? Що робити, якщо "Mmyyy nameee iisss Jesssssiiieee"?
Пауло Альмейда

Відповіді:


24

З tr:

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

Пояснення: -sПеремикач trсимволів, що повторюють "стискає". Як показано, комутатором можна користуватися з діапазоном символів: aдо z.


2
деяке пояснення команди може бути корисним для майбутніх читачів.
Geek

8

У системі GNU вам потрібно використовувати sedабо подібні, якщо ваш локальний код використовує багатобайтові символи ( як пропонує jimmij ), оскільки GNU trможе посилатися лише на символ на байт. З локальної мови ASCII ви можете видалити всі дублікати w / trlike:

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'
Костас

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.