Làm cách nào để sử dụng grep / ack với các tệp trong mã hóa tùy ý?


8

Trên máy tính để bàn Linux của tôi, tôi có một ngôn ngữ UTF-8. Khi tôi cố gắng tìm kiếm một số tệp được mã hóa KOI8-R bằng grep (ack), nó đã thất bại. Nếu tôi mã hóa thủ công mẫu thành KOI8-R và chuyển nó thành đối số, nó sẽ hoạt động.

Có thể nói cho grep biết nên sử dụng mã hóa nào cho mẫu không? Hoặc bất kỳ công cụ khác?

Câu trả lời:


6

Nếu tất cả các tệp bạn đang tìm kiếm có cùng mã hóa:

LC_CTYPE=ru_RU.KOI8-R luit ack-grep "$(echo 'привет' | iconv -t KOI8-R)" *.txt

hoặc trong bash hoặc zsh

LC_CTYPE=ru_RU.KOI8-R luit ack-grep "$(iconv -t KOI8-R <<<'привет')" *.txt

Hoặc bắt đầu một shell con trong mã hóa mong muốn:

$ LC_CTYPE=ru_RU.KOI8-R luit
$ ack-grep 'привет' *.txt
$ exit

Luit (được vận chuyển cùng với XFree86 và X.org) chạy chương trình được chỉ định trên dòng lệnh của nó trong miền địa phương được chỉ định bởi LC_CTYPEcài đặt, giả sử thiết bị đầu cuối UTF-8. Vì vậy, lệnh chạy trong miền địa phương mong muốn và Luit dịch đầu ra đầu cuối của nó thành UTF-8.

Một cách tiếp cận khác, nếu bạn có một cây thư mục có nhiều tệp trong một mã hóa khác nhau, là gắn kết một khung nhìn của cây thư mục đó dưới một mã hóa ưa thích của bạn. Tôi nghĩ rằng hệ thống tập tin fuseflt có thể làm điều này (chưa được kiểm tra).

mkdir /utf8-view
fuseflt iconv-koi8r-utf8.conf /some/dir /utf8-view
ack-grep 'привет' /utf8-view/*.txt.utf8
fusermount -u /utf8-view

nơi tập tin cấu hình iconv-koi8r-utf8.confchứa

ext_in =
ext_out = *.utf8
flt_in =
flt_out = .utf8
flt_cmd = iconv -f KOI8-R -t UTF-8

@eugeney Ngớ ngẩn với tôi, tôi quên rằng bạn cũng cần dịch mẫu, vì vậy nó phức tạp hơn một chút so với những gì tôi đã viết. Xin lỗi vì điều đó. Tôi cập nhật câu trả lời của tôi.
Gilles 'SO- ngừng trở nên xấu xa'
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.