コマンドラインだけを使用して特定の場所の文字を印刷したいと思います。たとえば、
<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
(5番目の文字を-z
処理する前に使用されます)\n