Mostra carattere nella posizione in un file


11

Vorrei stampare il personaggio in una determinata posizione usando solo la riga di comando. Per esempio:

<command> 5

Emetterebbe ase fosse il 5 ° carattere di quel file a.

Dal momento che ho a che fare con file di grandi dimensioni, idealmente questo sarebbe in grado di gestire file di grandi dimensioni.

Risposte:


4

Con sed:

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

Si noti che sednon sarà possibile produrre output se l'input contiene caratteri multibyte non validi nelle impostazioni internazionali correnti. Puoi usare LC_ALL=Cse lavori solo con caratteri a byte singolo.

Con il file ASCII, puoi anche utilizzare dd:

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

1
Esiste una soluzione che non comporta il dover reindirizzare l'input? Altrimenti sarà lento nei file bit no?
testTester

1
@testTester: basta usare il tuo file come operando per il comandosed 's/.\{4\}\(.\).*/\1/;q' file
cuonglm

9

Se vuoi il 5 ° byte, contando da 1:

dd ibs=1 skip=4 count=1

o

tail -c +5 | head -c 1

Nota che tailconta da 1, quindi dato un file contenente abcdefg, questo stampa e.

dde tail -csono in POSIX. head -cè comune, ma non è in POSIX; è in GNU coreutils, BusyBox, FreeBSD e NetBSd e non in OpenBSD o Solaris.


Vale probabilmente la pena ricordare che nella loro forma attuale, questi comandi non faranno nulla. Dovrai aggiungere un parametro di nome file ai comandi o immettere pipe in essi. es:cat file | tail -c +5 | head -c 1
rinogo

1
@rinogo Entrambi i comandi leggono dallo standard input e scrivono nello standard output.
Gilles 'SO- smetti di essere malvagio' il

1
Infatti! Il mio obiettivo era aiutare i nuovi utenti di Unix a capire come inserire i dati nei comandi.
Rinogo,

2

O usando (gnu) grep:

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

( -zera usato per trattare \nprima del 5 ° carattere)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.