У меня есть текстовый файл, в котором некоторые слова печатаются во ВСЕХ CAPS. Я хочу, чтобы иметь возможность просто преобразовать все в текстовый файл в нижний регистр, используя sed
. Это означает, что первое предложение будет читать: "У меня есть текстовый файл, в котором некоторые слова печатаются во всех кепках".
Sed one-liner для преобразования всех прописных букв в строчные буквы?
Ответ 1
С tr
:
$ tr '[:upper:]' '[:lower:]' < input.txt > output.txt
С GNU sed
(BSD sed
не поддерживает \L
):
$ sed -e 's/\(.*\)/\L\1/' input.txt > output.txt
Ответ 2
Если у вас есть расширения 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]
также поддерживаются с тире-r, но \d [digit]
и \D [non-digit]
нет.)
Ответ 3
Вы также можете сделать это очень легко с помощью awk
, если вы хотите рассмотреть другой инструмент:
echo "UPPER" | awk '{print tolower($0)}'
Ответ 4
Вот много решений:
Для повышения производительности с помощью 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
Ответ 5
echo "Hello MY name is SUJIT " | sed 's/./\L&/g'
Вывод:
hello my name is sujit
Ответ 6
Если вы используете 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
Удачи
Ответ 7
короткий, сладкий, и вам даже не нужно перенаправлять: -)
perl -p -i -e 'tr/A-Z/a-z/' file
Ответ 8
Мне нравятся некоторые ответы здесь, но есть команда sed, которая должна делать трюк на любой платформе:
sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'
Во всяком случае, это легко понять. И иногда бывает полезно знать о команде y.