Mostrar caractere na posição em um arquivo


11

Gostaria de imprimir o caractere em uma determinada posição usando apenas a linha de comando. Por exemplo:

<command> 5

Produziria ase o quinto caractere desse arquivo fosse a.

Como estou lidando com arquivos grandes, idealmente isso seria capaz de lidar com arquivos grandes.

Respostas:


4

Com sed:

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

Observe que sedfalhará na produção de saída se você inserir caracteres de vários bytes inválidos no código de idioma atual. Você pode usar LC_ALL=Cse trabalhar apenas com caracteres de byte único.

Com o arquivo ASCII, você também pode usar dd:

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

1
Existe alguma solução que não envolva a necessidade de canalizar a entrada? Caso contrário, será lento em arquivos de bit não?
testTester

1
@testTester: Basta usar o arquivo como operando para o comandosed 's/.\{4\}\(.\).*/\1/;q' file
cuonglm

9

Se você deseja o 5º byte, contando de 1:

dd ibs=1 skip=4 count=1

ou

tail -c +5 | head -c 1

Observe que tailconta a partir de 1, portanto, dado um arquivo que contém abcdefg, isso é impresso e.

dde tail -cestão no POSIX. head -cé comum, mas não está no POSIX; está no GNU coreutils, BusyBox, FreeBSD e NetBSd e mas não no OpenBSD ou Solaris.


Provavelmente vale a pena mencionar que, na forma atual, esses comandos não farão nada. Você precisará adicionar um parâmetro de nome de arquivo aos comandos ou inserir a entrada de canal neles. por exemplo:cat file | tail -c +5 | head -c 1
rinogo 06/04

1
@rinogo Ambos os comandos lêem da entrada padrão e gravam na saída padrão.
Gilles 'SO- stop be evil'

1
De fato! Meu objetivo era ajudar os novos no Unix a entender como obter dados nos comandos.
Rinogo 6/04

2

Ou usando (gnu) grep:

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

( -zfoi usado para lidar \nantes do quinto char)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.