Как преобразовать двоичный файл в ASCII в UNIX?

Я ищу определенную строку в довольно большом файле:

$ ls -lh archivo.csv
-rw-rw-rw- 1 yo yo 723M Dec 10 10:46 archivo.csv

Если я использую grep, я нахожу, что результат не появляется, а только указывает на то, что он есть в файле:

$ grep "12345" archivo.csv
Binary file archivo.csv matches

Итак, глядя на тип файла, о котором идет речь, я вижу, что это ...

$ file archivo.csv
archivo.csv: ISO-8859 text, with very long lines, with CRLF line terminators

Я преобразовал его в UNIX с помощью команды dos2unix:

$ dos2unix archivo.csv
dos2unix: converting file archivo.csv to Unix format...

Но проблема все еще появляется:

$ grep "12345" archivo.csv
Binary file archivo.csv matches

Я понял после grep имеет возможность поиска в двоичных файлах, -a:

$ grep -a "12345" archivo.csv
12345  esto es un test

Скважина man grep указывает на то, что:

-a, --text
    Process a binary file as if it were text; 
    this is equivalent to the --binary-files=text option.

Но так и всем интересно, как Могу ли я преобразовать этот двоичный файл в ASCII?

8
задан 10.12.2015, 12:14
2 ответа

Действительно, все файлы бинарные (очевидно), но когда вышеупомянутому бинарному кодированию мы даем ему интерпретацию X, тогда мы говорим, что есть кодирование у X (или они кодировались в X).

В твоем случае, файл не является бинарным, есть кодирование у МЕЖДУНАРОДНОЙ ОРГАНИЗАЦИИ ПО СТАНДАРТИЗАЦИИ-8859 и следовательно ты должен использовать программные средства, которые умели бы работать (поймите) вышеупомянутое кодирование.

Параметр -a grep вынуди, в который я проигнорировал некие коды, которые не интерпретированы как цепь текста Американский стандартный код обмена информацией (ej. \x0).

Так, в твоем случае, ты был бы должен обращать вышеупомянутый файл в другой, более соответствовавший твоим программным средствам, для чего, логически существуют много программных средств, но в меня, та, что больше мне нравится, состоит iconv в том, что в твоем случае оно было бы чем-то как (того же ref)

$ iconv -f ISO-8859-15 -t UTF-8 foo >foo.utf

(ОН ЗАМЕЧАЕТ: вместо в utf ты мог бы перемещать это в Американский стандартный код обмена информацией, как ты просишь, но тогда, может быть, терялась существующая информация в первоначальном файле как например символ §).

Например, беря этот файл мы имеем

$ file samples7.var
samples7.var: HTML document, ISO-8859 text
$ grep Deut samples7.var
Binary file samples7.var matches
$ grep -a Deut samples7.var
<TITLE>German / Deutsch S▒d (ISO Latin-1 / ISO 8859-1)</TITLE>
<H1>German / Deutsch S▒d (ISO Latin-1 / ISO 8859-1)</H1>
$ iconv -f ISO-8859-15 -t UTF-8 samples7.var > samples7.var.utf
$ file samples7.var.utf
samples7.var.utf: HTML document, UTF-8 Unicode text
$ grep Deut samples7.var.utf
<TITLE>German / Deutsch Süd (ISO Latin-1 / ISO 8859-1)</TITLE>
<H1>German / Deutsch Süd (ISO Latin-1 / ISO 8859-1)</H1>

Который, поскольку мы видим, оно позволяет отображать и просачиваться правильно, не теряя информации.

Уже в конце концов, использовать dos2unix он не подает тебя в этом случае, потому что команда требует, чтобы файлы были плоского текста, и у твоего файла нет этого кодирования (см. dos2unix).

10
ответ дан 24.11.2019, 15:06
  • 1
    Цюй и # 233; explicaci и # 243; n так fant и # 225; stica, и #161; большое спасибо! S и # 243; это у меня остается сомнение: и #191; из-за qu и # 233; он теряется s и # 237; mbolo §? –  fedorqui 10.12.2015, 13:55
  • 2
    Потому что этот s и # 237; mbolo он не существует в codificaci и # 243; n Американский стандартный код обмена информацией. Пункт отправления, чтобы изучать на этом podr и # 237; когда его быть es.wikipedia.org/wiki/Formato_de_archivo –  josejuan 10.12.2015, 14:16
  • 3
    @fedorqui: Заметьте, что todav и # 237; в файл это не Американский стандартный код обмена информацией... –  Flimzy 10.12.2015, 16:21
  • 4
    podr и # 237; чтобы делать tambi и # 233; n в единственном шаге используя pipe iconv -f ISO-8859-15 -t UTF-8 samples7.var | grep Deut –  eloyesp 11.12.2015, 04:58

Это что-то широкое, что ты спрашиваешь, так как для меня он зависел бы от, чем является то, что содержит файл и что является тем, что я хочу извлечь из него. Если он подает тебе способ, в котором grep обрати бинарный файл в текст и он не интересует тебя больше информация о файле, чем которая предлагает тебя, ты можешь использовать просто:

grep -a '*' archivo.csv > archivo_texto.csv
4
ответ дан 24.11.2019, 15:06
  • 1
    #161; Интересный м и # 233; все! N и # 243; tese, что надо помещать * между кавычками для того, чтобы он не расширил во все элементы в diretorio, в котором он занимается. и #161; Спасибо! –  fedorqui 10.12.2015, 13:58
  • 2
    Благодаря тебе из-за correcci и # 243; n:) –  ArthurChamz 10.12.2015, 18:35

Теги

Похожие вопросы