我想仅使用命令行在给定位置打印字符。例如:
<command> 5
a
如果该文件的第 5 个字符是 则输出a
。
由于我正在处理大文件,因此理想情况下这将能够处理大文件。
答案1
如果你想要第 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 中。
答案2
和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
答案3
或者使用 (gnu)grep:
grep -zoP '.{4}\K.' file
(-z
用于处理\n
第5个字符之前)