Afficher le caractère à la position dans un fichier


11

Je voudrais imprimer le caractère à une position donnée en utilisant uniquement la ligne de commande. Par exemple:

<command> 5

Sortirait asi le 5ème caractère de ce fichier était a.

Étant donné que je traite de gros fichiers, ce serait idéalement capable de gérer de gros fichiers.

Réponses:


4

Avec sed:

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

Notez que sedcela ne produira pas de sortie si votre entrée contient des caractères multi-octets non valides dans les paramètres régionaux actuels. Vous pouvez l'utiliser LC_ALL=Csi vous travaillez uniquement avec des caractères à un octet.

Avec le fichier ASCII, vous pouvez également utiliser dd:

$ echo 12345 | dd bs=1 skip=4 count=1 2>/dev/null
5

1
Existe-t-il une solution qui n'implique pas de devoir diriger l'entrée? Sinon, ce sera lent dans les fichiers bit non?
testTester du

1
@testTester: Utilisez simplement votre fichier comme opérande pour la commandesed 's/.\{4\}\(.\).*/\1/;q' file
cuonglm

9

Si vous voulez le 5ème octet, en comptant à partir de 1:

dd ibs=1 skip=4 count=1

ou

tail -c +5 | head -c 1

Notez que tailcompte à partir de 1, donc étant donné un fichier contenant abcdefg, cela s'imprime e.

ddet tail -csont en POSIX. head -cest courant, mais n'est pas dans POSIX; c'est dans GNU coreutils, BusyBox, FreeBSD et NetBSd et pas dans OpenBSD ou Solaris.


Il vaut probablement la peine de mentionner que dans leur forme actuelle, ces commandes ne feront rien. Vous devrez soit ajouter un paramètre de nom de fichier aux commandes, soit y entrer des tuyaux. par exemple:cat file | tail -c +5 | head -c 1
rinogo

1
@rinogo Les deux commandes lisent à partir de l'entrée standard et écrivent sur la sortie standard.
Gilles 'SO- arrête d'être méchant'

1
En effet! Mon objectif était d'aider les nouveaux utilisateurs d'Unix à comprendre comment obtenir des données dans les commandes.
rinogo

2

Ou en utilisant (gnu) grep:

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

(a -zété utilisé pour traiter \navant le 5e caractère)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.