sed однострочник для преобразования всего верхнего регистра в нижний регистр?

131

У меня есть текстовый файл, в котором некоторые слова напечатаны ВСЕМИ ЗАГЛАВНЫМИ буквами. Я хочу иметь возможность просто преобразовать все в текстовом файле в нижний регистр, используя sed. Это означает, что первое предложение будет гласить: «У меня есть текстовый файл, в котором некоторые слова напечатаны заглавными буквами».

магнетаром
источник
6
ты знаешь о trкоманде? Иногда это более подходит, чем sed.
Брайан Окли,
@ Брайан Окли Я не был до сих пор. Спасибо, что указали на это. Но как мне использовать его, чтобы сделать то, о чем я просил?
Magnetar
посмотрите ссылку, приведенную в ответе Рагурама.
Bryan Oakley
1
если вы должны использовать sed, cat <input> | sed 'y / ABCDEFÑØÅÆŒ / abcdefñøåæœ /' <- Вы должны детализировать все символы, от верхнего до нижнего. Я знаю, что писать все эти символы обременительно, но это также будет работать со всеми этими международными СПЕЦИАЛЬНЫМИ символами. :)
Арно Тейгсет

Ответы:

249

С tr:

# Converts upper to lower case 
$ tr '[:upper:]' '[:lower:]' < input.txt > output.txt

# Converts lower to upper case
$ tr '[:lower:]' '[:upper:]' < input.txt > output.txt

Работает с использованием GNU sed(BSD sedне поддерживает \L \U):

# Converts upper to lower case
$ sed -e 's/\(.*\)/\L\1/' input.txt > output.txt

# Converts lower to upper case
$ sed -e 's/\(.*\)/\U\1/' input.txt > output.txt
магнетаром
источник
6
Мне пришлось выбрать свой ответ, потому что я не фанат ответов, которые состоят только из ссылок.
Magnetar
6
OSX также не поддерживает расширения GNU :(
ekkis
2
sed -e 's/.*/\L&/' input.txt > output.txtдля GNU sed тоже отлично работает
Асфанд Кази
1
@ekkis OSX использует BSD (как уже упоминалось, BSD sed не поддерживает его). Попробуйте прочитать верхнюю строку, man sedчтобы узнать, какую версию вы используете.
Райдер
По какой-то причине, когда я использую ваш образец верхнего регистра, он добавляет Uперед каждой строкой
Xtremefaith
51

Если у вас есть расширения GNU, вы можете использовать команду sed \ L (полное нижнее совпадение или до тех пор, пока не будет достигнуто \ L [нижнее] или \ E [конец - отключить регистр]), например:

sed 's/.*/\L&/' <input >output

Примечание. '&' Означает полное соответствие шаблону.

В качестве примечания, расширения GNU включают \ U (верхний), \ u (верхний следующий символ совпадения), \ l (нижний следующий символ совпадения). Например, если вы хотите переписать предложение:

$ sed -r 's/\w+/\u&/g' <<< "Now is the time for all good men..." # Camel Case
Now Is The Time For All Good Men...

Примечание: поскольку предполагается, что у нас есть расширения GNU, мы также можем использовать опцию dash-r (расширенные регулярные выражения), которая позволяет использовать \ w (символ слова) и избавляет вас от необходимости избегать скобок захвата и одного или нескольких квантификатор (+). ( За исключением: \W [non-word], \s [whitespace], \S [non-whitespace]поддерживаются также с тире-р, но \d [digit]и \D [non-digit]не являются.)

Luv2code
источник
1
Очень полезный совет. Я обнаружил, что круглые скобки не нужны в примере с верблюдом. 's / \ w + / \ u & / g' также работает.
PJ_Finnegan
1
sed -ri 's/MATCH_WHATEVER/\L&/i' input-file.ext- использование /iмодификатора делает совпадение нечувствительным к регистру и, следовательно, является необязательным. -iПереключатель указывает СЭД , чтобы изменить файл в месте. Нет необходимости перенаправлять вывод в другой файл, если вам это не нужно.
Джим
1
Мне это действительно было нужно \E [end - toggle casing off]. Спасибо !
Мехди Йедес,
37

Вы также можете сделать это очень легко awk, если хотите рассмотреть другой инструмент:

echo "UPPER" | awk '{print tolower($0)}'
whitehat237
источник
1
Лучший ответ, так как работа с кириллицей. tr: - не работал с ним.
Amaroc,
2
Следите за персонажами с акцентами. tolowerне смогу справиться, Àнапример
Сэм Хьюстон
Вы можете переименовать кучу файлов с помощью этой команды: ls | awk '{print "mv " $0 " " tolower($0)}' | sh
Neekobus 08
15

Вот много решений:

В upercaser с perl, tr, sed и awk

perl -ne 'print uc'
perl -npe '$_=uc'
perl -npe 'tr/[a-z]/[A-Z]/'
perl -npe 'tr/a-z/A-Z/'
tr '[a-z]' '[A-Z]'
sed y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
sed 's/\([a-z]\)/\U\1/g'
sed 's/.*/\U&/'
awk '{print toupper($0)}'

Строчные буквы с помощью perl, tr, sed и awk

perl -ne 'print lc'
perl -npe '$_=lc'
perl -npe 'tr/[A-Z]/[a-z]/'
perl -npe 'tr/A-Z/a-z/'
tr '[A-Z]' '[a-z]'
sed y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
sed 's/\([A-Z]\)/\L\1/g'
sed 's/.*/\L&/'
awk '{print tolower($0)}'

Сложный bash в нижнем регистре:

while read v;do v=${v//A/a};v=${v//B/b};v=${v//C/c};v=${v//D/d};v=${v//E/e};v=${v//F/f};v=${v//G/g};v=${v//H/h};v=${v//I/i};v=${v//J/j};v=${v//K/k};v=${v//L/l};v=${v//M/m};v=${v//N/n};v=${v//O/o};v=${v//P/p};v=${v//Q/q};v=${v//R/r};v=${v//S/s};v=${v//T/t};v=${v//U/u};v=${v//V/v};v=${v//W/w};v=${v//X/x};v=${v//Y/y};v=${v//Z/z};echo "$v";done

Сложный bash в верхнем регистре:

while read v;do v=${v//a/A};v=${v//b/B};v=${v//c/C};v=${v//d/D};v=${v//e/E};v=${v//f/F};v=${v//g/G};v=${v//h/H};v=${v//i/I};v=${v//j/J};v=${v//k/K};v=${v//l/L};v=${v//m/M};v=${v//n/N};v=${v//o/O};v=${v//p/P};v=${v//q/Q};v=${v//r/R};v=${v//s/S};v=${v//t/T};v=${v//u/U};v=${v//v/V};v=${v//w/W};v=${v//x/X};v=${v//y/Y};v=${v//z/Z};echo "$v";done

Простой bash в нижний регистр:

while read v;do echo "${v,,}"; done

Простой bash в верхнем регистре:

while read v;do echo "${v^^}"; done

Обратите внимание, что $ {v,} и $ {v ^} изменяют только первую букву.

Вы должны использовать это так:

(while read v;do echo "${v,,}"; done) < input_file.txt > output_file.txt
Vouze
источник
7
echo  "Hello  MY name is SUJIT "  | sed 's/./\L&/g'

Вывод:

привет меня зовут суджит
Суджит Дхамале
источник
5

Мне нравятся некоторые ответы здесь, но есть команда sed, которая должна помочь на любой платформе:

sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'

Во всяком случае, это легко понять. И знание о команде y иногда может пригодиться.

Деннис
источник
2
Это не работает для произвольных международных символов, но работает для символов ASCII в OS / X
emrys57
Это определенно помогло мне. Должен признать, что это был первый раз, когда я использовал команду y. Спасибо!
monsune
4

Если вы используете posix sed

Выбор шаблона для любого случая (преобразование искомого шаблона с помощью этого sed, чем использование преобразованного шаблона в требуемой команде с использованием регулярного выражения:

echo "${MyOrgPattern} | sed "s/[aA]/[aA]/g;s/[bB]/[bB]/g;s/[cC]/[cC]/g;s/[dD]/[dD]/g;s/[eE]/[eE]/g;s/[fF]/[fF]/g;s/[gG]/[gG]/g;s/[hH]/[hH]/g;s/[iI]/[iI]/g;s/[jJ]/[jJ]/g;s/[kK]/[kK]/g;s/[lL]/[lL]/g;s/[mM]/[mM]/g;s/[nN]/[nN]/g;s/[oO]/[oO]/g;s/[pP]/[pP]/g;s/[qQ]/[qQ]/g;s/[rR]/[rR]/g;s/[sS]/[sS]/g;s/[tT]/[tT]/g;s/[uU]/[uU]/g;s/[vV]/[vV]/g;s/[wW]/[wW]/g;s/[xX]/[xX]/g;s/[yY]/[yY]/g;s/[zZ]/[zZ]/g" | read -c MyNewPattern
 YourInputStreamCommand | egrep "${MyNewPattern}"

преобразовать в нижний регистр

sed "s/[aA]/a/g;s/[bB]/b/g;s/[cC]/c/g;s/[dD]/d/g;s/[eE]/e/g;s/[fF]/f/g;s/[gG]/g/g;s/[hH]/h/g;s/[iI]/i/g;s/j/[jJ]/g;s/[kK]/k/g;s/[lL]/l/g;s/[mM]/m/g;s/[nN]/n/g;s/[oO]/o/g;s/[pP]/p/g;s/[qQ]/q/g;s/[rR]/r/g;s/[sS]/s/g;s/[tT]/t/g;s/[uU]/u/g;s/[vV]/v/g;s/[wW]/w/g;s/[xX]/x/g;s/[yY]/y/g;s/[zZ]/z/g"

то же самое для прописных букв, замените нижнюю букву между // на верхний эквивалент в sed

Радоваться, веселиться

NeronLeVelu
источник
(Я обнаружил, что этот лучше всего работает на MacOS) - Хорошо, мой друг, но крошечный топо - у вас есть чехол Jj наоборот. Должен быть sed "s / [aA] / a / g; s / [bB] / b / g; s / [cC] / c / g; s / [dD] / d / g; s / [eE] / е / г; с / [FF] / ж / г; с / [Gg] / г / г; с / [HH] / ч / г; с / [Ii] / я / г; с / [Jj] / Дж / г; с / [кК] / к / г, с / [Ll] / л / г; с / [мМ] / м / г; с / [NN] / п / г; с / [Oo] / о / г; с / [с] / р / г, с / [Qq] / д / г, с / [Rr] / г / г, с / [Ss] / с / г, с / [Tt] / т / г, с / [мкЕд] / и / г, с / [уУ] / об / г; с / [WW] / вес / г, с / [хХ] / х / г, с / [YY] / y / g; s / [zZ] / z / g »
Нил МакГилл
Не знаю, зачем вам делать что-то столь трудоемкое. Я предполагаю, что Mac OS не имеет расширений GNU, но если вы твердо настроены на использование sed, вместо замены ('s') вы можете использовать транслитерацию ('y') следующим образом: sed 'y / ABCDEFGHIJKLMNOPQRSTUVWXYZ / abcdefghijklmnopqrstuvwxyz / '
Luv2code
цель состояла в том, чтобы выбрать любой текстовый шаблон, который выглядит как нижний / верхний регистр из sed не GNU, без изменения содержимого источника данных ( y//изменить содержимое источника или пропустить поиск шаблона.
NeronLeVelu,
3

коротко, мило и даже не нужно перенаправление :-)

perl -p -i -e 'tr/A-Z/a-z/' file
Pedrito
источник
Ха, ну, я попытался использовать это, оглядываясь назад, и он каким-то образом заменил большинство букв в моих файлах другими случайными буквами верхнего регистра. Все равно посмеялся надо мной. Я также смог извлечь то, что хотел, из этого ответа о perl: askubuntu.com/a/527073/250556
ThorSummoner