ファイル内の位置に文字を表示する


11

コマンドラインのみを使用して、指定された位置に文字を印刷したいと思います。例えば:

<command> 5

aそのファイルの5番目の文字がであれば出力されますa

私は大きなファイルを扱っているので、理想的にはこれで大きなファイルを処理できます。

回答:


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 2016

1
@testTester:ファイルをコマンドのオペランドとして使用するだけsed 's/.\{4\}\(.\).*/\1/;q' file
cuonglm

9

1から数えて5番目のバイトが必要な場合:

dd ibs=1 skip=4 count=1

または

tail -c +5 | head -c 1

それに注意してくださいtailので、含まれているファイルを与えられ、1からカウントをabcdefg、このプリントをe

ddおよびtail -cPOSIXです。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

2

または(gnu)grepを使用:

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

(5番目の文字の前-zに対処するために使用されました\n

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.