Перевод букв в верхний/нижний регистр с помощью sed


ams - Posted on 08 Октябрь 2008

Задача: Хочется перевести текст в верхний или нижний регистр с помощью 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
АБВГ
5
Ваша оценка: Ничего Рейтинг: 5 (1 vote)

tr a-z A-Z

изчерпывающе Ж:-)
разве что добавить что это все gnu sed

Отправить комментарий

Google Friend Connect (leave a quick comment)
loading...
Содержание этого поля является приватным и не предназначено к показу.