Hiển thị ký tự tại vị trí trong một tệp


11

Tôi muốn in ký tự ở một vị trí nhất định chỉ sử dụng dòng lệnh. Ví dụ:

<command> 5

Sẽ xuất anếu char thứ 5 của tập tin đó a.

Vì tôi đang xử lý các tệp lớn, lý tưởng là nó có thể xử lý các tệp lớn.

Câu trả lời:


4

Với sed:

$ echo 12345 | sed 's/.\{4\}\(.\).*/\1/;q'
5
$ echo 1234ắ | sed 's/.\{4\}\(.\).*/\1/;q'
ắ

Lưu ý rằng sedsẽ không tạo ra đầu ra nếu đầu vào của bạn chứa các ký tự nhiều byte không hợp lệ trong ngôn ngữ hiện tại. Bạn có thể sử dụng LC_ALL=Cnếu bạn chỉ làm việc với các ký tự byte đơn.

Với tệp ASCII, bạn cũng có thể sử dụng dd:

$ echo 12345 | dd bs=1 skip=4 count=1 2>/dev/null
5

1
Có giải pháp nào không liên quan đến việc phải đặt ống đầu vào không? Nếu không nó sẽ bị chậm trong tập tin bit không?
testTester

1
@testTester: Chỉ cần sử dụng tệp của bạn dưới dạng toán hạng cho lệnhsed 's/.\{4\}\(.\).*/\1/;q' file
cuonglm

9

Nếu bạn muốn byte thứ 5, đếm từ 1:

dd ibs=1 skip=4 count=1

hoặc là

tail -c +5 | head -c 1

Lưu ý rằng tailtính từ 1, do đó, đưa ra một tệp có chứa abcdefg, bản in này e.

ddtail -cđang ở POSIX. head -clà phổ biến, nhưng không có trong POSIX; nó có trong GNU coreutils, BusyBox, FreeBSD và NetBSd và không có trong OpenBSD hoặc Solaris.


Có lẽ đáng nói là ở dạng hiện tại của chúng, các lệnh này sẽ không làm gì cả. Bạn sẽ cần phải thêm một tham số tên tệp vào các lệnh hoặc đầu vào đường ống vào chúng. ví dụ:cat file | tail -c +5 | head -c 1
rinogo

1
@rinogo Cả hai lệnh đọc từ đầu vào tiêu chuẩn và ghi vào đầu ra tiêu chuẩn.
Gilles 'SO- ngừng trở nên xấu xa'

1
Thật! Mục đích của tôi là giúp những người mới sử dụng Unix hiểu cách lấy dữ liệu vào các lệnh.
rinogo

2

Hoặc sử dụng (gnu) grep:

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

( -zđã được sử dụng để đối phó \ntrước char thứ 5)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.