Meskipun ini telah dijawab / diterima bertahun-tahun yang lalu, jawaban yang diterima saat ini hanya benar untuk pengkodean satu byte per karakter seperti iso-8859-1, atau untuk subset byte tunggal dari kumpulan karakter byte variabel (seperti karakter Latin dalam UTF-8). Bahkan menggunakan sambungan multi-byte sebagai gantinya tetap hanya akan berfungsi untuk pengkodean multi-byte tetap seperti UTF-16. Mengingat bahwa sekarang UTF-8 sedang dalam perjalanan untuk menjadi standar universal, dan ketika melihat daftar bahasa ini berdasarkan jumlah penutur asli dan daftar 30 bahasa teratas menurut penggunaan penutur asli / sekunder , penting untuk menunjukkan teknik sederhana variabel-byte character-friendly (bukan berbasis byte), menggunakan cut -cdan tr/ seddengan kelas-kelas karakter.
Bandingkan hal berikut yang gagal ganda karena dua kesalahan / praduga Latin-sentris umum mengenai masalah byte vs. karakter (satu headvs. cut, yang lain [a-z][A-Z]vs. [:upper:][:lower:]):
$ printf 'Πού μπορώ να μάθω σανσκριτικά;\n' | \
$ head -c 1 | \
$ sed -e 's/[A-Z]/[a-z]/g'
[[unreadable binary mess, or nothing if the terminal filtered it]]
untuk ini (catatan: ini berfungsi dengan baik di FreeBSD, tetapi baik cut& trdi GNU / Linux masih mengacaukan bahasa Yunani di UTF-8 untuk saya):
$ printf 'Πού μπορώ να μάθω σανσκριτικά;\n' | \
$ cut -c 1 | \
$ tr '[:upper:]' '[:lower:]'
π
Jawaban lain yang lebih baru telah mengusulkan "cut", tetapi hanya karena masalah sampingan yang dapat digunakan untuk menentukan offset sewenang-wenang, bukan karena karakter yang relevan secara langsung vs masalah byte.
Jika Anda cuttidak menangani -cpengkodean byte variabel dengan benar, untuk " Xkarakter pertama " (ganti Xdengan nomor Anda), Anda dapat mencoba:
sed -E -e '1 s/^(.{X}).*$/\1/' -e q - yang terbatas pada baris pertama
head -n 1 | grep -E -o '^.{X}' - yang terbatas pada baris pertama dan menghubungkan dua perintah sekalipun
dd - yang telah disarankan dalam jawaban lain, tetapi sangat merepotkan
sedSkrip rumit dengan buffer jendela geser untuk menangani karakter yang tersebar di beberapa baris, tetapi itu mungkin lebih rumit / rapuh daripada hanya menggunakan sesuatu sepertidd
Jika Anda trtidak menangani kelas karakter dengan pengkodean byte variabel dengan benar, Anda dapat mencoba:
sed -E -e 's/[[:upper:]]/\L&/g (Khusus GNU)
mkfifo /tmp/test.fifo; echo "hello world">/tmp/test.fifo & head -c 5 /tmp/test.fifojuga mengkonsumsi" world\n"yang hilang selamanya.