在文件中的位置显示字符


11

我只想使用命令行在给定位置打印字符。例如:

<command> 5

a如果该文件的第5个字符为,则将输出a

由于我正在处理大文件,因此理想情况下,它将能够处理大文件。

Answers:


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

1
有没有不需要通过管道输入的解决方案?否则位文件会慢吗?
testTester '16

1
@testTester:只需将文件用作命令的操作数sed 's/.\{4\}\(.\).*/\1/;q' file
cuonglm '16

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这两个命令都从标准输入读取并写入标准输出。
吉尔斯(Gilles)'“ SO-别再作恶了”

1
确实!我的目的是帮助Unix新手了解如何将数据获取到命令中。
rinogo '18 -4-6

2

或使用(gnu)grep:

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

-z用于处理\n第5个字符之前的字符)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.