Saya memiliki temp
file dengan konten huruf kecil dan huruf besar.
Memasukkan
Isi temp
file saya :
hi
Jigar
GANDHI
jiga
Saya ingin mengonversi semua atas ke bawah .
Perintah
Saya mencoba perintah berikut:
sed -e "s/[A-Z]/[a-z]/g" temp
tetapi mendapat output yang salah.
Keluaran
Saya menginginkannya sebagai:
hi
jigar
gandhi
jiga
Apa yang perlu di bagian pengganti argumen sed
?
Jawaban:
Jika input Anda hanya berisi karakter ASCII, Anda dapat menggunakan
tr
seperti:atau (kurang mudah diingat dan mengetik IMO; tetapi tidak terbatas pada huruf latin ASCII, meskipun dalam beberapa implementasi termasuk GNU
tr
, masih terbatas pada karakter byte tunggal, jadi di lokal UTF-8, masih terbatas pada huruf ASCII):jika Anda harus menggunakan
sed
:(di sini dengan asumsi implementasi GNU).
Dengan POSIX
sed
, Anda harus menentukan semua transliterasi dan kemudian Anda dapat memilih huruf mana yang ingin Anda konversi:Dengan
awk
:sumber
\L
adalah ekstensi GNU.\L
bekerja dengan baik untuk saya sejauh ini.sed
adalah perintah Unix. Sistem yang berbeda memiliki varian yang berbeda dengan perilaku dan fungsi yang berbeda pula. Untungnya, saat ini, ada standar yang paling sesuai sehingga Anda dapat mengandalkan set fitur minimum yang umum untuk semua.\L
tidak ada di antara mereka dan diperkenalkan oleh GNUsed
(cocok dengan operator yang sama dalam standarex
/vi
) dan umumnya tidak tersedia dalam implementasi lainnya.tr
implementasi seperti GNUtr
tidak berfungsi dengan baik di multi-byte locales (kebanyakan dari mereka saat ini, cobaecho STÉPHANE | tr '[:upper:]' '[:lower:]'
misalnya). Pada sistem GNU, Anda mungkin lebih sukased
varian atauawk
'stolower()
.sed 's/.*/\L&/g' < input
. The\1
mengacu pada substring cocok tidak akan bekerja kecuali Anda menentukan substring dengan kurung sebagai wurtle tidak dalam nya. Namun, ini sedikit lebih bersih untuk digunakan&
untuk mewakili seluruh pertandingan, seperti yang ditunjukkanMenggunakan vim, ini sangat sederhana:
Buka file,
gg
pergi ke baris0
pertama,, kolom pertama. DenganguG
, menurunkan huruf besar semua karakter hingga bagian bawah file.ZZ
menyimpan dan keluar.Itu harus menangani apa saja yang Anda lemparkan; itu akan mengabaikan angka, itu akan menangani non ASCII.
Jika Anda ingin melakukan yang sebaliknya, mengubah huruf cased kecil menjadi huruf besar, swap
u
keluar untukU
:gg0gUGZZ
dan Anda sudah siap.sumber
vim file1 file2 fileetc
dan kemudian sesuatu seperti mungkin:bufdo gg0guG:w<CR>
akan berfungsi untuk sejumlah file. Belum diuji itu!Saya suka
dd
untuk ini, saya sendiri....mendapat...
The
LC_ALL=C
adalah untuk melindungi multibytes setiap input - meskipun setiap ibukota multibyte tidak akan dikonversi. Hal yang sama berlaku untuk (GNU)tr
- kedua aplikasi cenderung memasukkan mangling di lokal non-C.iconv
dapat dikombinasikan dengan solusi komprehensif.The
2>/dev/null
redirect membuangdd
Status 's laporan default - dan stderr nya. Tanpa itudd
akan mengikuti penyelesaian pekerjaan seperti di atas dengan mencetak informasi seperti berapa byte yang diproses dan lain-lain.sumber
tr
saat menangani file besar, terima kasih!Anda juga dapat menggunakan Perl 5:
Opsi
-p
memberitahu perl untuk menjalankan ekspresi yang ditentukan satu kali untuk setiap baris input, mencetak hasilnya, yaitu nilai akhir dari$_
.-e
menunjukkan bahwa program akan menjadi argumen berikutnya, sebagai lawan dari file yang berisi skrip.lc
dikonversi ke huruf kecil. Tanpa argumen, itu akan beroperasi$_
. Dan$_=
menyimpannya lagi sehingga akan dicetak.Variasi itu akan menjadi
Menggunakan
-n
seperti-p
kecuali yang$_
tidak akan dicetak pada akhirnya. Jadi alih-alih menyimpan ke variabel itu, saya menyertakan pernyataan cetak eksplisit.Satu kelebihan Perl berbeda dengan sed adalah Anda tidak memerlukan ekstensi GNU. Ada proyek-proyek yang harus kompatibel dengan lingkungan non-GNU tetapi yang juga sudah memiliki dependensi Perl. Dibandingkan dengan
tr
, mungkin Perllc
dapat lebih mudah dibuat sadar-lokal. Lihatperllocale
halaman manual untuk detailnya.sumber
Anda perlu menangkap pola yang cocok dan kemudian menggunakannya dalam penggantian dengan pengubah:
The
\(...\)
"menangkap" para melampirkan cocok teks, penangkapan pertama pergi ke\1
, di samping\2
, dll penomoran ini sesuai dengan membuka kurung dalam kasus menangkap bersarang.The
\L
bertobat pola ditangkap untuk menurunkan kasus, ada juga\U
untuk kasus atas.sumber
&
Lebih jauh ke jawaban MvG, Anda juga bisa menggunakan Perl 6:
perl6 -pe .=lc temp
Di sini $ _ adalah implisit, dan Anda tidak perlu tanda kutip tunggal untuk melindunginya dari ekspansi oleh shell ($ _ menjadi parameter Bash khusus; lihat: https://www.gnu.org/software/bash/manual/ html_node / Special-Parameters.html )
sumber