Intereting Posts
Список файлов в другом (нерабочем) каталоге с шаблоном Можно ли выполнить оператор python с терминала? Библиотека float.h не найдена при компиляции gtk + 3 / vte с ​​помощью Homebrew Gnome-shell не может настроить яркость экрана на ноутбуке Dell с графикой Intel Можно ли получить идентификатор группы процессов из / proc? Глобально остановить редакторы от создания ~ файлов Как извлечь 1-й, 3-й, 5-й группы из трех строк командой sed или awk? что такое DEVLINKS в выводе udevadm info –query = свойство –name = / dev / mmcblk0 Почему загрузка высока, несмотря на то, что ни процессор, ни диск не используются Как разрешить доступ без полномочий root к Nexus 7 2013 LTE (deb) через adb и fastboot? Синхронизация Active Directory для OpenLDAP SSH требует пароль для первого входа Как мне разрешить скрипту доступ к файлу? Как отличить репо от встроенных пакетов с помощью dnf? Показывать результат на другом «экране» и возвращаться в нормальное состояние

Как преобразовать файлы txt UTF-8 во все прописные буквы в bash?

У меня есть файлы UTF-8 .txt, которые я бы хотел преобразовать во все прописные. Если бы это был просто ASCII, я мог бы использовать:

tr [:lower:] [:upper:] 

Но поскольку я работаю с диакритикой и т. Д., Это, похоже, не работает. Я думаю, это может сработать, если я установил соответствующий язык, но мне нужен этот сценарий для переносимости.

Все:

 tr '[:lower:]' '[:upper:]' 

(не забывайте кавычки, иначе это не сработает, если в текущем каталоге есть файл с именем : l , … или r ) или:

 awk '{print toupper($0)}' 

или:

 dd conv=ucase 

предназначены для преобразования символов в верхний регистр в соответствии с правилами, определенными в текущей локали. Тем не менее, даже если локали используют UTF-8 в качестве набора символов и четко определяют преобразование из нижнего регистра в верхний регистр, по крайней мере, GNU dd , GNU tr и mawk (по умолчанию awk на Ubuntu, например) не следуют им. Кроме того, нет стандартного способа указать локали, отличные от C или POSIX , поэтому, если вы хотите конвертировать файлы UTF-8 в верхний регистр портативно, независимо от текущей локали, вам не повезло со стандартным инструментом.

Как часто, для переносимости, ваш лучший выбор может быть perl:

 $ echo lľsšcčtťzž | PERLIO=:utf8 perl -pe '$_=uc' LĽSŠCČTŤZŽ 

Теперь вам нужно остерегаться того, что не все согласны с тем, что такое прописная версия определенного символа.

Например, в турецких локалях верхний регистр i не I , а İ ( <U0130> ). Здесь с реликвией toolchest tr вместо GNU tr:

 $ echo ií | LC_ALL=C.UTF-8 tr '[:lower:]' '[:upper:]' IÍ $ echo ií | LC_ALL=tr_TR.UTF-8 tr '[:lower:]' '[:upper:]' İÍ 

В моей системе преобразование perl to-upper определено в /usr/share/perl/5.14/unicore/To/Upper.pl , и я обнаружил, что он ведет себя по-разному на нескольких символах из GNU libc toupper() в C.UTF8 например, perl является более точным. Например, perl правильно преобразует ɀ в Ɀ , GNU libc (2.17) этого не делает.

Я думаю, вы можете сделать это с помощью awk и его функции toupper .

Например

Не работает с GNU tr :

 $ echo lľsšcčtťzž | tr '[:lower:]' '[:upper:]' LľSšCčTťZž 

Работает с GNU awk :

 $ echo lľsšcčtťzž | awk '{ print toupper($0) }' LĽSŠCČTŤZŽ 

Это работает с OS X tr но не с GNU tr :

 tr '[:lower:]' '[:upper:]' 

Это работает с gawk но не с mawk или nawk (который /usr/bin/awk в OS X):

 awk '{print toupper($0)}' 

Другой вариант – использовать GNU sed :

 sed 's/./\u&/g' 

В Bash 4.0 и более поздних версиях вы также можете использовать расширение параметра ^^ :

 while IFS= read -rl;do printf %s\\n "${l^^}";done