在文件中的位置显示字符

tes*_*ter 14 command-line text-processing

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

<command> 5
Run Code Online (Sandbox Code Playgroud)

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

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

Gil*_*il' 12

如果你想要第 5 个字节,从 1 开始计数:

dd ibs=1 skip=4 count=1
Run Code Online (Sandbox Code Playgroud)

或者

tail -c +5 | head -c 1
Run Code Online (Sandbox Code Playgroud)

请注意,tail从 1 开始计数,因此给定一个包含 的文件abcdefg,这会打印e.

dd并且tail -c在 POSIX 中。head -c很常见,但不在 POSIX 中;它在 GNU coreutils、BusyBox、FreeBSD 和 NetBSd 中,但不在 OpenBSD 或 Solaris 中。


cuo*_*glm 7

sed

$ echo 12345 | sed 's/.\{4\}\(.\).*/\1/;q'
5
$ echo 1234? | sed 's/.\{4\}\(.\).*/\1/;q'
?
Run Code Online (Sandbox Code Playgroud)

请注意,sed如果您输入的当前语言环境中包含无效的多字节字符,则将无法产生输出。LC_ALL=C如果您仅使用单字节字符,则可以使用。

对于 ASCII 文件,您还可以使用dd

$ echo 12345 | dd bs=1 skip=4 count=1 2>/dev/null
5
Run Code Online (Sandbox Code Playgroud)