Mesmo que isso tenha sido respondido / aceito anos atrás, a resposta atualmente aceita é correta apenas para codificações de um byte por caractere como iso-8859-1, ou para subconjuntos de byte único de conjuntos de caracteres de bytes variáveis (como caracteres latinos em UTF-8). Mesmo usando emendas de bytes múltiplos, em vez disso, ainda funcionaria apenas para codificações de vários bytes fixos como UTF-16. Dado que agora o UTF-8 está a caminho de ser um padrão universal, e ao olhar para esta lista de idiomas por número de falantes nativos e esta lista dos 30 principais idiomas por uso nativo / secundário , é importante apontar um Técnica simples de caracteres de byte variável (não baseada em bytes), usando cut -ce tr/ sedcom classes de caracteres.
Compare o seguinte, que falha duplamente devido a dois erros / presunções centradas no latim comuns em relação ao problema de bytes vs. caracteres (um é headvs. cut, o outro é [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]]
para isso (nota: isto funcionou bem no FreeBSD, mas ambos cut& tron GNU / Linux ainda mutilado grega em UTF-8 para me embora):
$ printf 'Πού μπορώ να μάθω σανσκριτικά;\n' | \
$ cut -c 1 | \
$ tr '[:upper:]' '[:lower:]'
π
Outra resposta mais recente já havia proposto "cortar", mas apenas por causa do problema secundário que pode ser usado para especificar deslocamentos arbitrários, não por causa do problema de caractere x bytes diretamente relevante.
Se o seu cutnão lidar -ccom codificações de bytes variáveis corretamente, para "os primeiros Xcaracteres" (substitua Xpelo seu número), você pode tentar:
sed -E -e '1 s/^(.{X}).*$/\1/' -e q - que se limita à primeira linha
head -n 1 | grep -E -o '^.{X}' - que é limitado à primeira linha e encadeia dois comandos embora
dd - o que já foi sugerido em outras respostas, mas é muito complicado
- Um
sedscript complicado com buffer de janela deslizante para lidar com caracteres espalhados por várias linhas, mas isso é provavelmente mais complicado / frágil do que apenas usar algo comodd
Se o seu trnão lidar com classes de caracteres com codificações de bytes variáveis corretamente, você pode tentar:
sed -E -e 's/[[:upper:]]/\L&/g (Específico do GNU)
mkfifo /tmp/test.fifo; echo "hello world">/tmp/test.fifo & head -c 5 /tmp/test.fifotambém consome o" world\n"que se perde para sempre.