Показывать символ в позиции в файле

11

Я хотел бы напечатать символ в данной позиции, используя только командную строку. Например:

<command> 5

Будет выводить, aесли 5-й символ этого файла был a.

Поскольку я имею дело с большими файлами, в идеале это будет возможность обрабатывать большие файлы.

testTester
источник

Ответы:

4

С sed:

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

Обратите внимание, что sedвывод не получится, если вы введете недопустимые многобайтовые символы в текущей локали. Вы можете использовать, LC_ALL=Cесли вы работаете только с однобайтовыми символами.

С файлом ASCII вы также можете использовать dd:

$ echo 12345 | dd bs=1 skip=4 count=1 2>/dev/null
5
cuonglm
источник
1
Есть ли решение, которое не включает в себя необходимость ввода данных? Иначе это будет медленно в битовых файлах нет?
testTester
1
@testTester: Просто используйте свой файл в качестве операнда для командыsed 's/.\{4\}\(.\).*/\1/;q' file
cuonglm
9

Если вы хотите 5-й байт, считая от 1:

dd ibs=1 skip=4 count=1

или

tail -c +5 | head -c 1

Обратите внимание, что tailотсчитывается от 1, поэтому, учитывая файл abcdefg, это печатает e.

ddи tail -cнаходятся в POSIX. head -cраспространено, но не в POSIX; это в GNU coreutils, BusyBox, FreeBSD и NetBSd, но не в OpenBSD или Solaris.

Жиль "ТАК - перестань быть злым"
источник
Вероятно, стоит упомянуть, что в их текущей форме эти команды ничего не сделают. Вам нужно будет либо добавить параметр имени файла к командам, либо ввести в них канал. Например:cat file | tail -c +5 | head -c 1
Rinogo
1
@rinogo Обе команды читают из стандартного ввода и записывают в стандартный вывод.
Жиль "ТАК - перестань быть злым"
1
Верно! Моя цель состояла в том, чтобы помочь новичкам в Unix понять, как вводить данные в команды.
Риного
2

Или используя (GNU) grep:

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

( -zраньше имел дело \nдо 5-го символа)

JJoao
источник