Преобразовать содержимое файла в нижний регистр


85

У меня есть tempфайл с содержимым в нижнем и верхнем регистре.

вход

Содержание моего tempфайла:

hi
Jigar
GANDHI
jiga

Я хочу преобразовать все верхнее в нижнее .

команда

Я попробовал следующую команду:

sed -e "s/[A-Z]/[a-z]/g" temp

но получил неправильный вывод.

Выход

Я хочу это как:

hi
jigar
gandhi
jiga

Что должно быть в замещающей части аргумента для sed?


Ответы:


122

Если ваш ввод содержит только символы ASCII, вы можете использовать trкак:

tr A-Z a-z < input 

или (менее легко запомнить и ввести IMO; но не ограничиваясь латинскими буквами ASCII, хотя в некоторых реализациях, включая GNU tr, все еще ограничивается однобайтовыми символами, поэтому в локалях UTF-8, все еще ограниченных буквами ASCII):

tr '[:upper:]' '[:lower:]' < input

если вы должны использовать sed:

sed 's/.*/\L&/g' < input

(здесь предполагается реализация GNU).

В POSIX sedвам нужно будет указать все транслитерации, а затем вы сможете выбрать, какие буквы вы хотите конвертировать:

sed 'y/AǼBCΓDEFGH.../aǽbcγdefgh.../' < input

С awk:

awk '{print tolower($0)}' < input

3
Обратите внимание, что \Lэто расширение GNU.
Энтон

\Lпока работает хорошо для меня
Обсудите,

2
@JigarGandhi. sedэто команда Unix Разные системы имеют разные варианты с разным поведением и функциональностью. К счастью, в настоящее время существует стандарт, который наиболее соответствует, так что вы можете рассчитывать на минимальный набор функций, общих для всех. \Lне входит в их число и был введен GNU sed(соответствует одному и тому же оператору в стандарте ex/ vi) и, как правило, недоступен в других реализациях.
Стефан Шазелас

9
Обратите внимание, что некоторые trреализации, такие как GNU tr, не работают должным образом в многобайтовых локалях (большинство из них в настоящее время, попробуйте, echo STÉPHANE | tr '[:upper:]' '[:lower:]'например). В системах GNU вы можете предпочесть sedвариант или awks tolower().
Стефан Шазелас

5
Незначительная коррекция: sed 's/.*/\L&/g' < input. \1Ссылка на совпадающую подстроку не будет работать , если не указана подстрока с скобкой , как wurtle делает в своем. Тем не менее, это немного чище использовать &для представления всего матча, как показано на рисунке
Эдвард Браун

30

Используя vim, это очень просто:

$ vim filename
gg0guGZZ

Открывает файл, ggпереходит на первую строку 0, первый столбец. С guG, понижает регистр всех символов до нижней части файла. ZZсохраняет и выходит.

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

Если вы хотите сделать обратное, переведите буквы в нижнем регистре в верхний регистр, поменяйте местами uна a U: gg0gUGZZи все готово.


14
Lol "супер просто"
Blambert

это очевидно не хорошо масштабируется для многих файлов
Кори Голдберг

мой самый любимый ответ на сегодняшний день !!!!
Мона Джалал

1
@CoreyGoldberg, vim file1 file2 fileetcа затем что-то подобное :bufdo gg0guG:w<CR>, вероятно, будет работать для любого количества файлов. Хотя не проверял это!
TankorSmash

@TankorSmash, который все еще не масштабируется до большого количества файлов
Кори Голдберг

17

Я люблю ddэто для себя.

<<\IN LC_ALL=C 2<>/dev/null \
dd conv=lcase
hi
Jigar 
GANDHI
jiga
IN

... получает ...

hi
jigar
ghandi
jiga

Он LC_ALL=Cпредназначен для защиты любых многобайтовых входных данных - хотя любые многобайтовые прописные не будут преобразованы. То же самое относится и к (GNU) tr - оба приложения склонны к искажению ввода в любой локали, отличной от C. iconvможет быть объединен с любым для комплексного решения.

2>/dev/nullRedirect Отбрасывает ddотчет По умолчанию статус - и его STDERR. Без этого ddследовало бы завершение работы, такой как приведенная выше, с печатью информации, например, сколько байтов было обработано и т. Д.


Это решение намного быстрее, чем trпри работе с большими файлами, спасибо!
WhiteWinterWolf

13

Вы также можете использовать Perl 5:

perl -pe '$_=lc' temp

Опция -pуказывает Perl запускать указанное выражение один раз для каждой строки ввода, печатая результат, то есть конечное значение $_. -eуказывает, что программа будет следующим аргументом, в отличие от файла, содержащего скрипт. lcпреобразует в нижний регистр Без аргумента он будет работать $_. И $_=сохраняет это снова, чтобы оно было напечатано.

Вариация этого будет

perl -ne 'print lc' temp

Использование -nпохоже на -pто, что $_в конце концов оно не будет напечатано. Поэтому вместо сохранения в эту переменную я включаю явное выражение для печати.

Одним из преимуществ Perl по сравнению с sed является то, что вам не нужны никакие расширения GNU. Есть проекты, которые должны быть совместимы с не-GNU средами, но которые также уже имеют зависимость от Perl. По сравнению с trэтим, Perl lcможет быть легче ориентирован на локали. Смотрите perllocaleman-страницу для деталей.


9

Вам нужно захватить совпавший шаблон и затем использовать его при замене модификатором:

sed 's/\([A-Z]\)/\L\1/g' temp

\(...\)«Захватывает» вшита Найденный текст, то первый захват идет к \1, следующий \2и т.д. Нумерация согласно открывающих скобок в случае вложенных захватами.

\LОбращенная захваченный узор в нижнем регистре, есть также \Uдля верхнего корпуса.


3
вам не нужно этого делать - весь шаблон всегда пойман&
mikeserv

Правда, но тогда я бы упустил возможность объяснить захват матчей :-)
wurtel

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.