Aunque esto fue respondido / aceptado hace años, la respuesta actualmente aceptada solo es correcta para codificaciones de un byte por carácter como iso-8859-1, o para los subconjuntos de un byte de conjuntos de caracteres de bytes variables (como caracteres latinos dentro de UTF-8). Incluso el uso de empalmes de varios bytes en su lugar solo funcionaría para codificaciones fijas de varios bytes como UTF-16. Dado que ahora UTF-8 está en camino de convertirse en un estándar universal, y al mirar esta lista de idiomas por número de hablantes nativos y esta lista de los 30 idiomas principales por uso nativo / secundario , es importante señalar un Técnica simple y amigable con los caracteres de bytes variables (no basada en bytes), usando cut -cy tr/ sedcon clases de caracteres.
Compare lo siguiente que falla doblemente debido a dos errores / presunciones comunes centrados en el latín con respecto al problema de bytes frente a caracteres (uno es headvs. cut, el otro es [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]]
a esto (nota: esto funcionó bien en FreeBSD, pero ambos cuty tren GNU / Linux todavía destrozaron el griego en UTF-8 para mí):
$ printf 'Πού μπορώ να μάθω σανσκριτικά;\n' | \
$ cut -c 1 | \
$ tr '[:upper:]' '[:lower:]'
π
Otra respuesta más reciente ya había propuesto "cortar", pero solo debido al problema secundario de que se puede usar para especificar compensaciones arbitrarias, no debido al problema de caracteres frente a bytes directamente relevante.
Si cutno maneja -ccorrectamente las codificaciones de bytes variables, para "los primeros Xcaracteres" (reemplace Xcon su número) puede intentar:
sed -E -e '1 s/^(.{X}).*$/\1/' -e q - que se limita a la primera línea, aunque
head -n 1 | grep -E -o '^.{X}' - que se limita a la primera línea y encadena dos comandos aunque
dd - que ya se sugirió en otras respuestas, pero es realmente engorroso
- Un
sedscript complicado con búfer de ventana deslizante para manejar caracteres repartidos en varias líneas, pero que probablemente sea más engorroso / frágil que simplemente usar algo comodd
Si trno maneja correctamente las clases de caracteres con codificaciones de bytes variables, puede intentar:
sed -E -e 's/[[:upper:]]/\L&/g (Específico de GNU)
mkfifo /tmp/test.fifo; echo "hello world">/tmp/test.fifo & head -c 5 /tmp/test.fifotambién consume lo" world\n"que se pierde para siempre.