sed one-liner untuk mengubah semua huruf besar menjadi huruf kecil?

131

Saya memiliki file teks di mana beberapa kata dicetak dalam SEMUA CAPS. Saya ingin bisa mengonversi semua yang ada di textfile menjadi huruf kecil, menggunakan sed. Itu berarti bahwa kalimat pertama kemudian akan berbunyi, 'Saya memiliki file teks di mana beberapa kata dicetak dalam huruf besar semua.'

magnetar
sumber
6
apakah Anda mengetahui trperintahnya? Terkadang lebih cocok daripada sed.
Bryan Oakley
@Bryan Oakley Saya tidak sampai sekarang. Terima kasih telah menunjukkannya. Tetapi bagaimana saya menggunakannya untuk melakukan apa yang saya minta?
magnetar
lihat tautan yang disediakan dalam jawaban Raghuram.
Bryan Oakley
1
jika Anda harus menggunakan sed, cat <input> | sed 'y / ABCDEFÑØÅÆŒ / abcdefñøåæœ /' <- Anda harus merinci semua karakter, huruf besar hingga kecil. Saya tahu sulit untuk menulis semua karakter itu, tetapi itu juga akan berfungsi dengan semua karakter KHUSUS internasional. :)
Arno Teigseth

Jawaban:

248

Dengan 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

Bekerja menggunakan GNU sed(BSD sedtidak mendukung \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
magnetar
sumber
6
Saya harus memilih jawaban sendiri karena saya bukan penggemar jawaban yang hanya terdiri dari tautan.
magnetar
6
OSX juga tidak mendukung ekstensi GNU :(
ekkis
2
sed -e 's/.*/\L&/' input.txt > output.txtuntuk GNU, sed juga berfungsi dengan baik
Asfand Qazi
1
@ekkis OSX menggunakan BSD (seperti yang disebutkan, BSD sed tidak mendukungnya). Coba baca baris paling atas man seduntuk mengetahui versi mana yang Anda gunakan.
Ryder
Untuk beberapa alasan ketika saya menggunakan pola huruf besar Anda, ia menambahkan sebuah Udi depan setiap baris
Xtremefaith
51

Jika Anda memiliki ekstensi GNU, Anda dapat menggunakan sed \ L (seluruh kecocokan yang lebih rendah, atau sampai \ L [lebih rendah] atau \ E [end - toggle casing off] tercapai), seperti:

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

Catatan: '&' berarti pola kecocokan penuh.

Sebagai catatan tambahan, ekstensi GNU meliputi \ U (atas), \ u (karakter kecocokan berikutnya), \ l (karakter kecocokan berikutnya lebih rendah). Misalnya, jika Anda ingin membuat unta kalimat:

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

Catatan: Karena asumsinya adalah kita memiliki ekstensi GNU, kita juga dapat menggunakan opsi tanda hubung-r (extended regular expressions), yang memungkinkan \ w (karakter kata) dan melegakan Anda karena harus melarikan diri dari kurung tanda kurung dan satu atau lebih quantifier (+). (Selain: \W [non-word], \s [whitespace], \S [non-whitespace]juga didukung dengan dasbor-r, tapi \d [digit]dan \D [non-digit]tidak.)

Kode Luv2
sumber
1
Tip yang sangat berguna. Saya telah menemukan bahwa kurung bulat tidak diperlukan dalam contoh kasus unta. 's / \ w + / \ u & / g' juga berfungsi.
PJ_Finn mulai
1
sed -ri 's/MATCH_WHATEVER/\L&/i' input-file.ext- menggunakan /ipengubah membuat korek api tidak sensitif dan karenanya opsional. The -iberalih Menceritakan sed untuk mengubah file di tempat. Tidak perlu mengarahkan output ke file lain jika Anda tidak perlu.
Jim
1
Saya sangat membutuhkan ini \E [end - toggle casing off]. Terima kasih !
Mehdi Yedes
37

Anda juga dapat melakukannya dengan sangat mudah awk, jika Anda mau mempertimbangkan alat lain:

echo "UPPER" | awk '{print tolower($0)}'
whitehat237
sumber
1
Jawaban terbaiknya, karena bekerja dengan cyrillic. tr: - tidak bekerja dengannya.
Amaroc
2
Perhatikan karakter dengan aksen. tolowertidak akan dapat menangani Àmisalnya
Sam Houston
Anda dapat mengubah nama banyak file dengan perintah itu: ls | awk '{print "mv " $0 " " tolower($0)}' | sh
Neekobus
15

Berikut ini banyak solusi:

Untuk upercaser dengan perl, tr, sed dan 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)}'

Untuk huruf kecil dengan perl, tr, sed dan 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 rumit untuk huruf kecil:

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 rumit ke huruf besar:

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 sederhana untuk huruf kecil:

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

Bash sederhana ke huruf besar:

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

Perhatikan bahwa $ {v,} dan $ {v ^} hanya mengubah huruf pertama.

Anda harus menggunakannya seperti itu:

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

Keluaran:

halo nama saya sujit
Sujit Dhamale
sumber
5

Saya suka beberapa jawaban di sini, tetapi ada perintah sed yang harus melakukan trik pada platform apa pun:

sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'

Bagaimanapun, mudah dimengerti. Dan mengetahui tentang perintah y kadang bisa berguna.

Dennis
sumber
2
Ini tidak berfungsi untuk karakter internasional yang arbitrer tetapi berfungsi untuk karakter ASCII di OS / X
emrys57
Ini tentu saja berhasil bagi saya. Saya harus mengakui itu adalah pertama kalinya saya menggunakan perintah y. Terima kasih!
monsune
4

Jika Anda menggunakan sed posix

Pilihan untuk setiap kasus untuk suatu pola (mengonversi pola yang dicari dengan sed ini daripada menggunakan pola yang dikonversi dalam perintah yang Anda inginkan menggunakan 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}"

konversi dalam huruf kecil

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"

sama untuk huruf besar, ganti huruf kecil antara // dengan ekuivalen atas di sed

Selamat bersenang-senang

NeronLeVelu
sumber
(Saya menemukan ini bekerja paling baik di MacOS) - Bagus, teman saya - tetapi topo kecil - Anda memiliki kasus Jj mundur. Harus 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 "
Neil McGill
Saya tidak yakin mengapa Anda perlu melakukan sesuatu yang begitu padat karya. Saya berasumsi Mac OS tidak memiliki ekstensi GNU, tetapi jika Anda mati untuk menggunakan sed, bukan substitusi ('s') Anda dapat menggunakan transliterasi ('y') seperti: sed 'y / ABCDEFGHIJKLMNOPQRSTUVWXYZ / abcdefghijklmnopqrstuvwxyz / '
Luv2code
tujuannya adalah untuk memilih pola teks apa pun yang terlihat seperti huruf kecil / huruf besar dari bukan GNU tanpa mengubah konten sumber data ( y//perubahan konten sumber atau bisa ketinggalan pencarian pola.
NeronLeVelu
3

pendek, manis dan Anda bahkan tidak perlu pengalihan :-)

perl -p -i -e 'tr/A-Z/a-z/' file
pedrito
sumber
Hah, well saya mencoba menggunakan ini dengan melihat ke belakang dan entah bagaimana mengganti sebagian besar semua huruf dalam file saya dengan huruf besar acak lainnya. Pokoknya saya tertawa. Saya dapat memperoleh apa yang saya inginkan dari jawaban ini juga tentang perl: askubuntu.com/a/527073/250556
ThorSummoner