Obwohl dies vor Jahren beantwortet / akzeptiert wurde, ist die derzeit akzeptierte Antwort nur für Codierungen mit einem Byte pro Zeichen wie iso-8859-1 oder für Einzelbyte-Teilmengen von Zeichensätzen mit variablem Byte (wie lateinische Zeichen) korrekt innerhalb von UTF-8). Selbst die Verwendung von Mehrbyte-Spleißen würde immer noch nur für Fest-Multibyte-Codierungen wie UTF-16 funktionieren. Angesichts der Tatsache, dass UTF-8 jetzt auf dem besten Weg ist, ein universeller Standard zu werden, und wenn man sich diese Liste der Sprachen nach Anzahl der Muttersprachler und diese Liste der 30 besten Sprachen nach Muttersprache / Sekundärverwendung ansieht , ist es wichtig, auf a hinzuweisen einfache, zeichenfreundliche (nicht bytebasierte) Technik mit variablen Bytes unter Verwendung von cut -c
und tr
/sed
mit Zeichenklassen.
Vergleichen Sie Folgendes, das aufgrund zweier häufiger lateinischer Fehler / Vermutungen in Bezug auf das Problem Bytes vs. Zeichen (eines ist head
vs. cut
, das andere ist [a-z][A-Z]
vs. [:upper:][:lower:]
) doppelt fehlschlägt :
$ printf 'Πού μπορώ να μάθω σανσκριτικά;\n' | \
$ head -c 1 | \
$ sed -e 's/[A-Z]/[a-z]/g'
[[unreadable binary mess, or nothing if the terminal filtered it]]
auf diese (Anmerkung: diese hat gut funktioniert auf FreeBSD, aber sowohl cut
& tr
auf GNU / Linux noch griechischen verstümmelt in UTF-8 für mich aber):
$ printf 'Πού μπορώ να μάθω σανσκριτικά;\n' | \
$ cut -c 1 | \
$ tr '[:upper:]' '[:lower:]'
π
Eine andere neuere Antwort hatte bereits "Ausschneiden" vorgeschlagen, jedoch nur aufgrund des Nebenproblems, mit dem beliebige Offsets angegeben werden können, nicht aufgrund des direkt relevanten Problems zwischen Zeichen und Bytes.
Wenn Sie mit Variablen-Byte-Codierungen nicht richtig cut
umgehen -c
, können Sie für "die ersten X
Zeichen" (durch X
Ihre Nummer ersetzen ) Folgendes versuchen:
sed -E -e '1 s/^(.{X}).*$/\1/' -e q
- was jedoch auf die erste Zeile beschränkt ist
head -n 1 | grep -E -o '^.{X}'
- Dies ist auf die erste Zeile beschränkt und verkettet jedoch zwei Befehle
dd
- was bereits in anderen Antworten vorgeschlagen wurde, aber wirklich umständlich ist
- Ein kompliziertes
sed
Skript mit Schiebefensterpuffer zur Verarbeitung von Zeichen, die über mehrere Zeilen verteilt sind, aber das ist wahrscheinlich umständlicher / fragiler als nur die Verwendung von so etwasdd
Wenn Sie tr
Zeichenklassen mit variablen Byte-Codierungen nicht korrekt verarbeiten, können Sie Folgendes versuchen:
sed -E -e 's/[[:upper:]]/\L&/g
(GNU-spezifisch)
mkfifo /tmp/test.fifo; echo "hello world">/tmp/test.fifo & head -c 5 /tmp/test.fifo
verbraucht auch," world\n"
was für immer verloren ist.