Замените двойные согласные буквы на буквы с помощью команды sed - PullRequest
0 голосов
/ 02 февраля 2020

Как заменить двойные согласные только одной буквой, используя команду sed Linux. Пример: УИЛЬЯМ -> ВИЛЬЯМ. grep -E '(.)\1+' команды находят слова, которые следуют за двумя одинаковыми согласными в шаблоне строки, но как заменить их только одним вхождением буквы?

Я пытался

cat test.txt | head | tr -s '[^AEUIO\n]' '?'

Ответы [ 2 ]

2 голосов
/ 02 февраля 2020

Подберите один согласный, запомните его в \( \), затем снова сопоставьте с \1 и подставьте его себе.

sed 's/\([bcdfghjklmnpqrstvxzBCDFGHJKLMNPQRSTVXZ]\)\1/\1/'
2 голосов
/ 02 февраля 2020

tr - это все или ничего; он заменит все вхождения выбранных символов, независимо от контекста. Для замены регулярных выражений посмотрите на sed - вы даже включили это в теги своего вопроса, но, похоже, вы не исследовали, как это может быть полезно?

sed 's/\(.\)\1/\1/g' test.txt

Точка соответствует любому символу; чтобы ограничить только согласными, измените его на [b-df-hj-np-tv-xz] или что-либо еще имеющее смысл (может быть расширено, чтобы включить верхний регистр; возможно, включить символы с акцентом?) на grep без -E (отсюда и все обратные слеши); хотя некоторые реализации sed также поддерживают эту опцию для выбора расширенного диалекта регулярных выражений POSIX.

Ни sed не tr не требуется cat для чтения стандартного ввода для них (хотя tr неясно делает не принимать аргумент имени файла). См. Также тангенциально Бесполезное использование кошки?

...