Перевод букв в верхний/нижний регистр с помощью sed
Задача: Хочется перевести текст в верхний или нижний регистр с помощью sed. Делаем несколько попыток.
1)
$ echo 'slovo слово' | sed 'y/[:lower:]/[:upper:]/'
supvp словоИными словами, класс символов POSIX не распознался.
2)
$ echo 'slovo слово' | sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'
SLOVO словоРаботает, но, во-первых, утомительно, а во-вторых, не работают буквы из национальных алфавитов.
3)
$ echo 'slovo слово' | sed 's/[[:lower:]]/[[:upper:]]/g'
[[:upper:]][[:upper:]][[:upper:]][[:upper:]][[:upper:]] [[:upper:]][[:upper:]][[:upper:]][[:upper:]][[:upper:]]Буквы в нижнем регистре распознались правильно, а вот со строкой замены не все в порядке.
4)
$ echo 'slovo слово' | sed 's/[[:lower:]]/\u&/g'
SLOVO СЛОВОА вот рабочий вариант. Специальная последовательность \u переводит следующий за ней один символ в верхний регистр.
Аналогичная последовательность \l переводит один следующий символ в нижний регистр.
Последовательности \U или \L переводят все символы в верхний или нижний регистр пока не встретится \E или не закончится строка подстановки.
Пример:
$ echo 'ТОРВАльдс лиНУС' | sed 's/\(\S\+\)\s\+\(\S\+\)/\L\u\2\E \L\u\1/'
Линус ТорвальдсШаблон захватывает первое слово (последовательность непробельных символов \S\+) в переменную \1, ищет один или несколько пробелов \s\+ и захватывает второе слово в переменную \2. Подстановка переводит переменную \2 в нижний регистр с помощью \L...\E и делает первую букву слова заглавной с помощью \u. Затем печатается пробел и подобным образом измененная переменная \1. В этом случае, однако, нет необходимости закрывать команду \L с помощью \E, т.к. строка подстановки на этом заканчивается.
PS. Для правильной работы данных команд необходима правильная настройка локали. Без комментариев:
$ echo "абвг" | iconv -f utf8 -t koi8-r | sed 's/[[:lower:]]/\u&/g' | iconv -f koi8-r -t utf8 абвг $ echo "абвг" | iconv -f utf8 -t koi8-r | LC_ALL=ru_RU.KOI8-R sed 's/[[:lower:]]/\u&/g' | iconv -f koi8-r -t utf8 АБВГ
- 8701 просмотр
Страница для печати

tr a-z A-Z
изчерпывающе Ж:-)
разве что добавить что это все gnu sed
Отправить комментарий