Même si cela a été répondu / accepté il y a des années, la réponse actuellement acceptée n'est correcte que pour les encodages à un octet par caractère comme iso-8859-1, ou pour les sous-ensembles à un octet de jeux de caractères à octets variables (comme les caractères latins dans UTF-8). Même l'utilisation d'épissures multi-octets à la place ne fonctionnerait que pour les encodages multi-octets fixes comme UTF-16. Étant donné que maintenant UTF-8 est en passe de devenir une norme universelle, et lorsque vous examinez cette liste de langues par nombre de locuteurs natifs et cette liste des 30 principales langues par usage natif / secondaire , il est important de souligner un technique simple à octets variable (non basée sur les octets), utilisant cut -c
et tr
/ sed
avec des classes de caractères.
Comparez ce qui suit qui échoue doublement en raison de deux erreurs / présomptions courantes centrées sur le latin concernant le problème des octets par rapport aux caractères (l'un est head
contre cut
, l'autre est [a-z][A-Z]
contre [: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]]
à ceci (note: cela a bien fonctionné sur FreeBSD, mais les deux cut
et tr
sur GNU / Linux ont toujours mutilé le grec en UTF-8 pour moi cependant):
$ printf 'Πού μπορώ να μάθω σανσκριτικά;\n' | \
$ cut -c 1 | \
$ tr '[:upper:]' '[:lower:]'
π
Une autre réponse plus récente avait déjà proposé "couper", mais uniquement à cause du problème secondaire qu'il peut être utilisé pour spécifier des décalages arbitraires, pas à cause du problème directement pertinent entre les caractères et les octets.
Si vous cut
ne gérez pas -c
correctement les encodages en octets variables, pour "les premiers X
caractères" (remplacez-les X
par votre numéro), vous pouvez essayer:
sed -E -e '1 s/^(.{X}).*$/\1/' -e q
- qui se limite cependant à la première ligne
head -n 1 | grep -E -o '^.{X}'
- qui est limité à la première ligne et enchaîne cependant deux commandes
dd
- qui a déjà été suggéré dans d'autres réponses, mais qui est vraiment encombrant
- Un
sed
script compliqué avec un tampon de fenêtre coulissant pour gérer des caractères répartis sur plusieurs lignes, mais qui est probablement plus encombrant / fragile que d'utiliser simplement quelque chose commedd
Si votre tr
ne gère pas correctement les classes de caractères avec des codages d'octets variables, vous pouvez essayer:
sed -E -e 's/[[:upper:]]/\L&/g
(Spécifique à GNU)
mkfifo /tmp/test.fifo; echo "hello world">/tmp/test.fifo & head -c 5 /tmp/test.fifo
consomme aussi" world\n"
ce qui est perdu à jamais.