sed one-liner, щоб перетворити всі великі регістри в малі?


131

У мене є текстовий файл, в якому деякі слова друкуються у ВСІХ КАПАХ. Я хочу мати можливість просто перетворити все в текстовому файлі в малі регістри, використовуючи sed. Це означає, що в першому реченні тоді було б написано: "У мене є текстовий файл, в якому деякі слова друкуються великими літерами".


6
чи знаєте ви trкоманду? Іноді це більше підходить, ніж sed.
Брайан Оуклі

@Bryan Oakley Я до цього не був. Дякуємо, що вказали на це. Але як я використовую це, щоб робити те, про що я питав?
магнітар

подивіться за посиланням, що міститься у відповіді Рагурама.
Брайан Оуклі

1
якщо ви повинні використовувати sed, cat <input> | sed 'y / ABCDEFÑØÅÆŒ / abcdefñøåæœ /' <- Ви повинні детально ознайомитись з усіма символами, прописними літерами до малих літер. Я знаю, що писати всі ці символи громіздко, але це також буде працювати з усіма цими міжнародними СПЕЦІАЛЬНИми характеристиками. :)
Arno Teigseth

Відповіді:


248

З 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
Мені довелося обрати власну відповідь, тому що я не прихильник відповідей, які складаються лише із посилань.
магнітар

6
OSX також не підтримує розширення GNU :(
ekkis

2
sed -e 's/.*/\L&/' input.txt > output.txtдля GNU sed теж чудово працює
Asfand Qazi

1
@ekkis OSX використовує BSD (як згадувалося, BSD sed не підтримує його). Спробуйте прочитати верхній рядок, man sedщоб знати, яку версію ви використовуєте.
Райдер

З якоїсь причини, коли я використовую ваш верхній регістр, він додає Uперед кожним рядком
Xtremefaith

51

Якщо у вас є розширення GNU, ви можете використовувати \ 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]не є.)


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)}'

1
Найкраща його відповідь, адже робота з кирилицею. tr: - Не працював з цим.
Amaroc

2
Слідкуйте за персонажами з наголосами. Наприклад, tolowerне вдасться впоратисяÀ
Сем Х'юстон,

Ви можете перейменувати купу файлів за допомогою цієї команди: ls | awk '{print "mv " $0 " " tolower($0)}' | sh
Neekobus

15

Ось багато рішень:

Щоб переконатись у перпер, 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)}'

Складний баш на малі літери:

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

Складний баш на великі регістри:

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

Простий баш на малі літери:

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

Простий баш на великі регістри:

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

Зауважте, що $ {v,} і $ {v ^} змінюють лише першу букву.

Ви повинні використовувати його таким чином:

(while read v;do echo "${v,,}"; done) < input_file.txt > output_file.txt


5

Мені подобаються деякі відповіді тут, але є команда sed, яка повинна робити трюк на будь-якій платформі:

sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'

У будь-якому випадку це легко зрозуміти. І знати про команду y іноді може стати в нагоді.


2
Це не працює для довільних міжнародних символів, але працює для символів ASCII в OS / X
emrys57

Це, безумовно, зробило роботу для мене. Я мушу визнати, що я вперше застосував команду y. Дякую!
мусон

4

Якщо ви використовуєте posix sed

Вибір для будь-якого випадку шаблону (перетворення шуканого шаблону за допомогою цього sed, ніж використання перетвореного шаблону в потрібній команді за допомогою regex:

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

Весело


(Я виявив, що цей працює найкраще на MacOS) - Приємно, друже, але крихітний топо - у тебе справа Jj назад. Повинно бути 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 / [jJ] / j / 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 "
Ніл Макгілл

Я не впевнений, чому потрібно робити щось таке трудомістке. Я припускаю, що Mac OS не має розширень GNU, але якщо ви померли, використовуючи sed, замість заміщення ('s') ви можете використовувати транслітерацію ('y'), як-от: sed 'y / ABCDEFGHIJKLMNOPQRSTUVWXYZ / abcdefghijklmnopqrstuvwxyxy / '
Luv2code

мета полягала в тому, щоб вибрати будь-який текстовий шаблон, який буде схожий на нижній / верхній регістр з не GNU sed без зміни вмісту джерела даних ( y//змінити вміст джерела або міг пропустити пошук шаблону.
NeronLeVelu

3

короткий, милий, і вам навіть не потрібно перенаправлення :-)

perl -p -i -e 'tr/A-Z/a-z/' file

Так, я намагався використати це з оглядом позаду, і це якимось чином замінило більшість листів у моїх файлах на інші випадкові великі літери. Все одно дав мені гарний сміх. Мені вдалося отримати те, що я хотів і з цієї відповіді про perl: askubuntu.com/a/527073/250556
ThorSummoner
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.