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


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.