Zeichen an Position in einer Datei anzeigen

11

Ich möchte das Zeichen an einer bestimmten Position nur über die Befehlszeile drucken. Z.B:

<command> 5

Würde ausgegeben, awenn das 5. Zeichen dieser Datei wäre a.

Da es sich um große Dateien handelt, kann dies idealerweise große Dateien verarbeiten.

testTester
quelle

Antworten:

4

Mit sed:

$ echo 12345 | sed 's/.\{4\}\(.\).*/\1/;q'
5
$ echo 1234ắ | sed 's/.\{4\}\(.\).*/\1/;q'
ắ

Beachten Sie, dass sedkeine Ausgabe erzeugt wird, wenn Ihre Eingabe ungültige Mehrbytezeichen im aktuellen Gebietsschema enthält. Sie können verwenden, LC_ALL=Cwenn Sie nur mit Einzelbytezeichen arbeiten.

Mit der ASCII-Datei können Sie auch Folgendes verwenden dd:

$ echo 12345 | dd bs=1 skip=4 count=1 2>/dev/null
5
cuonglm
quelle
1
Gibt es eine Lösung, bei der die Eingabe nicht weitergeleitet werden muss? Andernfalls wird es in Bit-Dateien langsam sein, nein?
TestTester
1
@ TestTester: Verwenden Sie einfach Ihre Datei als Operand für den Befehlsed 's/.\{4\}\(.\).*/\1/;q' file
cuonglm
9

Wenn Sie das 5. Byte möchten, zählen Sie von 1:

dd ibs=1 skip=4 count=1

oder

tail -c +5 | head -c 1

Beachten Sie, dass dies tailvon 1 an zählt. Wenn also eine Datei enthalten ist abcdefg, wird dies gedruckt e.

ddund tail -csind in POSIX. head -cist üblich, aber nicht in POSIX; Es ist in GNU Coreutils, BusyBox, FreeBSD und NetBSd und nicht in OpenBSD oder Solaris.

Gilles 'SO - hör auf böse zu sein'
quelle
Es ist wahrscheinlich erwähnenswert, dass diese Befehle in ihrer aktuellen Form nichts bewirken. Sie müssen den Befehlen entweder einen Dateinamenparameter hinzufügen oder eine Pipe-Eingabe in sie eingeben. zB:cat file | tail -c +5 | head -c 1
Rinogo
1
@rinogo Beide Befehle lesen von der Standardeingabe und schreiben in die Standardausgabe.
Gilles 'SO - hör auf böse zu sein'
1
Tatsächlich! Mein Ziel war es, Unix-Neulingen zu helfen, zu verstehen, wie Daten in die Befehle eingegeben werden.
Rinogo
2

Oder mit (gnu) grep:

grep -zoP '.{4}\K.'   file

( -zwurde verwendet, um \nvor dem 5. Zeichen zu behandeln)

JJoao
quelle