Bu yıllar önce yanıtlanmış / kabul edilmiş olsa da, şu anda kabul edilen cevap yalnızca iso-8859-1 gibi karakter başına bir bayt kodlamaları veya değişken baytlı karakter kümelerinin tek baytlı alt kümeleri için doğrudur (Latin karakterleri gibi) UTF-8 dahilinde). Bunun yerine birden çok baytlı eklemeler kullanmak bile, yine de yalnızca UTF-16 gibi sabit çok baytlı kodlamalar için çalışacaktır. Şimdi UTF-8 evrensel standart olma ve bakarken yolunda iyi olduğunu düşünürsek anadili sayısına göre dillerin bu listeye ve üst 30 dilde yerli / ikincil kullanım ile bu listede , a işaret etmek önemlidir basit değişken baytlı karakter dostu (bayt tabanlı değil) teknik, karakter sınıfları kullanarak cut -c
ve tr
/ sed
ile.
Baytlara karşı karakter sorununa ilişkin iki yaygın Latin merkezli hata / varsayım nedeniyle iki kez başarısız olan aşağıdakileri karşılaştırın (biri head
vs cut
, diğeri [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]]
Bu (: FreeBSD üzerinde bu işlenmiş ince, ancak her iki nota cut
& tr
benim olsa için UTF-8 Yunan hala mangled GNU / Linux üzerinde):
$ printf 'Πού μπορώ να μάθω σανσκριτικά;\n' | \
$ cut -c 1 | \
$ tr '[:upper:]' '[:lower:]'
π
Daha yeni bir cevap daha önce "kesme" yi önermişti, ancak bunun yalnızca keyfi ofsetleri belirtmek için kullanılabileceği yan sorunu nedeniyle, doğrudan ilgili karaktere karşı bayt sorunu nedeniyle değil.
Eğer senin cut
işlemez -c
"ilk için doğru değişken bayt kodlamaları ile X
karakterler" (replace X
deneyebilirsin numaranıza):
sed -E -e '1 s/^(.{X}).*$/\1/' -e q
- yine de ilk satırla sınırlı
head -n 1 | grep -E -o '^.{X}'
- ilk satırla sınırlıdır ve yine de iki komut zincirler
dd
- başka yanıtlarda zaten önerilmiş olan ancak gerçekten külfetli
sed
Birden çok satıra yayılan karakterleri işlemek için kayan pencere arabelleğine sahip karmaşık bir komut dosyası, ancak bu muhtemelen yalnızcadd
Eğer senin tr
değişken bayt kodlamaları ile karakter sınıfları işlemez doğru bir deneyebilirsiniz:
sed -E -e 's/[[:upper:]]/\L&/g
(GNU'ya özel)
mkfifo /tmp/test.fifo; echo "hello world">/tmp/test.fifo & head -c 5 /tmp/test.fifo
tüketir" world\n"
.