У меня есть temp
файл с содержимым в нижнем и верхнем регистре.
вход
Содержание моего temp
файла:
hi
Jigar
GANDHI
jiga
Я хочу преобразовать все верхнее в нижнее .
команда
Я попробовал следующую команду:
sed -e "s/[A-Z]/[a-z]/g" temp
но получил неправильный вывод.
Выход
Я хочу это как:
hi
jigar
gandhi
jiga
Что должно быть в замещающей части аргумента для sed
?
Ответы:
Если ваш ввод содержит только символы ASCII, вы можете использовать
tr
как:или (менее легко запомнить и ввести IMO; но не ограничиваясь латинскими буквами ASCII, хотя в некоторых реализациях, включая GNU
tr
, все еще ограничивается однобайтовыми символами, поэтому в локалях UTF-8, все еще ограниченных буквами ASCII):если вы должны использовать
sed
:(здесь предполагается реализация GNU).
В POSIX
sed
вам нужно будет указать все транслитерации, а затем вы сможете выбрать, какие буквы вы хотите конвертировать:С
awk
:источник
\L
это расширение GNU.\L
пока работает хорошо для меняsed
это команда Unix Разные системы имеют разные варианты с разным поведением и функциональностью. К счастью, в настоящее время существует стандарт, который наиболее соответствует, так что вы можете рассчитывать на минимальный набор функций, общих для всех.\L
не входит в их число и был введен GNUsed
(соответствует одному и тому же оператору в стандартеex
/vi
) и, как правило, недоступен в других реализациях.tr
реализации, такие как GNUtr
, не работают должным образом в многобайтовых локалях (большинство из них в настоящее время, попробуйте,echo STÉPHANE | tr '[:upper:]' '[:lower:]'
например). В системах GNU вы можете предпочестьsed
вариант илиawk
stolower()
.sed 's/.*/\L&/g' < input
.\1
Ссылка на совпадающую подстроку не будет работать , если не указана подстрока с скобкой , как wurtle делает в своем. Тем не менее, это немного чище использовать&
для представления всего матча, как показано на рисункеИспользуя vim, это очень просто:
Открывает файл,
gg
переходит на первую строку0
, первый столбец. СguG
, понижает регистр всех символов до нижней части файла.ZZ
сохраняет и выходит.Он должен справляться практически со всем, что вы на него бросаете; он будет игнорировать числа, он будет обрабатывать не ASCII.
Если вы хотите сделать обратное, переведите буквы в нижнем регистре в верхний регистр, поменяйте местами
u
на aU
:gg0gUGZZ
и все готово.источник
vim file1 file2 fileetc
а затем что-то подобное:bufdo gg0guG:w<CR>
, вероятно, будет работать для любого количества файлов. Хотя не проверял это!Я люблю
dd
это для себя.... получает ...
Он
LC_ALL=C
предназначен для защиты любых многобайтовых входных данных - хотя любые многобайтовые прописные не будут преобразованы. То же самое относится и к (GNU)tr
- оба приложения склонны к искажению ввода в любой локали, отличной от C.iconv
может быть объединен с любым для комплексного решения.2>/dev/null
Redirect Отбрасываетdd
отчет По умолчанию статус - и его STDERR. Без этогоdd
следовало бы завершение работы, такой как приведенная выше, с печатью информации, например, сколько байтов было обработано и т. Д.источник
tr
при работе с большими файлами, спасибо!Вы также можете использовать Perl 5:
Опция
-p
указывает Perl запускать указанное выражение один раз для каждой строки ввода, печатая результат, то есть конечное значение$_
.-e
указывает, что программа будет следующим аргументом, в отличие от файла, содержащего скрипт.lc
преобразует в нижний регистр Без аргумента он будет работать$_
. И$_=
сохраняет это снова, чтобы оно было напечатано.Вариация этого будет
Использование
-n
похоже на-p
то, что$_
в конце концов оно не будет напечатано. Поэтому вместо сохранения в эту переменную я включаю явное выражение для печати.Одним из преимуществ Perl по сравнению с sed является то, что вам не нужны никакие расширения GNU. Есть проекты, которые должны быть совместимы с не-GNU средами, но которые также уже имеют зависимость от Perl. По сравнению с
tr
этим, Perllc
может быть легче ориентирован на локали. Смотритеperllocale
man-страницу для деталей.источник
Вам нужно захватить совпавший шаблон и затем использовать его при замене модификатором:
\(...\)
«Захватывает» вшита Найденный текст, то первый захват идет к\1
, следующий\2
и т.д. Нумерация согласно открывающих скобок в случае вложенных захватами.\L
Обращенная захваченный узор в нижнем регистре, есть также\U
для верхнего корпуса.источник
&
В дополнение к ответу MvG, вы также можете использовать Perl 6:
perl6 -pe .=lc temp
Здесь $ _ неявно, и вам не нужны одинарные кавычки, чтобы защитить его от раскрытия оболочкой ($ _ является специальным параметром Bash; см .: https://www.gnu.org/software/bash/manual/ html_node / Special-Parameters.html )
источник