Преобразовать весь текст из прописных в строчные и наоборот?
17
У меня вопрос, как я могу преобразовать весь текст из прописных в строчные и наоборот? То есть поменять регистры всех букв. Это должно быть сделано с sedзаменой как-то.
Ваш второй предполагает наличие GNU sedи альтернативного регистра на входе. Используйте sed -re 's/([[:lower:]]?)([[:upper:]]?)/\U\1\L\2/g'вместо этого (все еще специфично для GNU). Первая конвертирует только 26 латинских букв ASCII, а вторая - любую букву, распознаваемую как таковую вашей локалью. trОдин имеет смысл только в ASCII местах. perlОдин работает только для ASCII латинских букв.
Стефан Шазелас
16
POSIXly, это не может быть сделано, sedкроме как путем предоставления полного набора букв, которые вы хотите транслитерировать, как показано @cuonglm .
Это может быть сделано с помощью tr, и вот для чего tr(транслитерация):
tr '[:lower:][:upper:]' '[:upper:][:lower:]'
Однако в Linux у него есть ограничения. Из 3 trреализаций, обычно встречающихся в системах на основе Linux:
с GNU trэто работает только для однобайтовых наборов символов. Например, Stéphane Chazelasв локалях UTF-8 это дает sTéPHANE cHAZELASвместо sTÉPHANE cHAZELAS. Это известное ограничение GNU tr.
с trпомощью инструмента семейной реликвии, это не работает (вы понимаете stéphane chazelas).
Это не та вещь, которую trбудет делать busybox .
На FreeBSD это работает нормально, хотя. Вы ожидаете, что он будет работать нормально и в сертифицированных системах Unix.
В bashоболочке есть специальный оператор для этого:
Так что в настольном мире только OSX делает это? Почему это не может работать? Это просто разные реализации, так как кажется, что в шестнадцатеричном значении есть постоянное смещение между строчной версией акцентированного символа и его заглавной копией?
1
@освет, не знаю, что ты имеешь в виду под миром рабочего стола . AFAICS, проблема с GNU, большинство Unices имеют «рабочие столы». Кроме ASCII и некоторых кодировок iso8859, я не знаю, что вы можете обобщить шестнадцатеричное смещение, и это не имеет смысла для кодировок, таких как UTF-8. Например, в UTF-8 заглавными буквами ⴠ(e2 b4 a0) является Ⴠ(e1 83 80); оба i(69) и ı(c4 b1) имеют I(49) в верхнем регистре (за исключением турецких языков, где iставится İ). Причина, по которой он не работает с GNU, trзаключается в том, что GNU trработает с байтами, а не с символами.
Стефан Шазелас
Я имею в виду мейнстрим, но на самом деле это не имеет смысла, так что спасибо за внимание. Я просто посмотрел на французские акцентированные символы (и на самом деле просто «é») и сделал очень упрощенные предположения, снова забыв, что речь идет о байтах. Но семейная реликвия одна? Я пойду читать этот ответ снова!
1
@lightÉ, для семейной реликвии это другая проблема, кажется, она поддерживает только одно вхождение [:lower:]или [:upper:](так что первое игнорируется). Даже на французском œ -> Œесть c5 93 -> c5 92в UTF-8 и bd -> bcв iso8859-15.
Стефан Шазелас
2
Хотя это имеет те же ограничения, которые уже упоминались в качестве trрешения, предложенного Стефаном Шазеласом, это еще один способ сделать это:
Я сваливать stderrв /dev/nullтам , потому что ddтакже предоставляет статистику всех своих операций на 2дескрипторе файла. Это может быть полезно в зависимости от того, что вы делаете, но не для этой демонстрации. Все остальные вещи, с которыми вы можете работать, по- ddпрежнему применимы, например:
Это не меняет дело, хотя (как в aBcне конвертируется в AbC).
Стефан Шазелас
1
@ StéphaneChazelas - правда, но если я не понял, это был не вопрос, не так ли?
Микесерв
2
Если вашей главной целью является преобразование файла из нижнего класса в верхний класс, почему бы вам не использовать trи STDOUTпреобразовать ваш файл:
$cat FILENAME | tr a-z A-Z > FILENAME2
где FILENAME ваш оригинальный файл? Где FILENAME2ваш конвертированный выходной файл.
tr
было бы более подходящим, чемsed
.Ответы:
Вот прямой путь в
sed
:или более короткий путь с GNU
sed
, работающий с любым символом, для которого в вашей локали существует преобразование в нижний регистр <->:если вы можете использовать другие инструменты, такие как:
perl
(ограничено буквами ASCII):perl
(в более общем смысле):источник
sed
и альтернативного регистра на входе. Используйтеsed -re 's/([[:lower:]]?)([[:upper:]]?)/\U\1\L\2/g'
вместо этого (все еще специфично для GNU). Первая конвертирует только 26 латинских букв ASCII, а вторая - любую букву, распознаваемую как таковую вашей локалью.tr
Один имеет смысл только в ASCII местах.perl
Один работает только для ASCII латинских букв.POSIXly, это не может быть сделано,
sed
кроме как путем предоставления полного набора букв, которые вы хотите транслитерировать, как показано @cuonglm .Это может быть сделано с помощью
tr
, и вот для чегоtr
(транслитерация):Однако в Linux у него есть ограничения. Из 3
tr
реализаций, обычно встречающихся в системах на основе Linux:tr
это работает только для однобайтовых наборов символов. Например,Stéphane Chazelas
в локалях UTF-8 это даетsTéPHANE cHAZELAS
вместоsTÉPHANE cHAZELAS
. Это известное ограничение GNUtr
.tr
помощью инструмента семейной реликвии, это не работает (вы понимаетеstéphane chazelas
).tr
будет делать busybox .На FreeBSD это работает нормально, хотя. Вы ожидаете, что он будет работать нормально и в сертифицированных системах Unix.
В
bash
оболочке есть специальный оператор для этого:С
zsh -o extendedglob
:источник
ⴠ
(e2 b4 a0) являетсяჀ
(e1 83 80); обаi
(69) иı
(c4 b1) имеютI
(49) в верхнем регистре (за исключением турецких языков, гдеi
ставитсяİ
). Причина, по которой он не работает с GNU,tr
заключается в том, что GNUtr
работает с байтами, а не с символами.[:lower:]
или[:upper:]
(так что первое игнорируется). Даже на французскомœ -> Œ
естьc5 93 -> c5 92
в UTF-8 иbd -> bc
в iso8859-15.Хотя это имеет те же ограничения, которые уже упоминались в качестве
tr
решения, предложенного Стефаном Шазеласом, это еще один способ сделать это:ВЫХОД
Я сваливать
stderr
в/dev/null
там , потому чтоdd
также предоставляет статистику всех своих операций на2
дескрипторе файла. Это может быть полезно в зависимости от того, что вы делаете, но не для этой демонстрации. Все остальные вещи, с которыми вы можете работать, по-dd
прежнему применимы, например:ВЫХОД:
источник
aBc
не конвертируется вAbC
).Если вашей главной целью является преобразование файла из нижнего класса в верхний класс, почему бы вам не использовать
tr
иSTDOUT
преобразовать ваш файл:где
FILENAME
ваш оригинальный файл? ГдеFILENAME2
ваш конвертированный выходной файл.источник
é
например (по крайней мере, в моем файле).используя
awk
:источник
>file.txt
будет начинаться с усечения файлаruby
для этого есть строковый метод, похожий на использование из командной строкиperl
Смотрите также ruby-doc Encoding
источник
Оставь простую вещь простой. Фильтр предназначен для перевода символов
tr
.источник