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.

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

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.


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)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.