извлечь строку из двоичного файла - проблема с регулярным выражением - PullRequest
3 голосов
/ 23 мая 2019

У меня есть двоичный файл, который содержит читаемое имя файла *, ограниченное «namexx:» и «xx: piece», где x - любая цифра от 0 до 9 в обоих случаях.

Я работаю на Mac в Bash 5.

Я пытался использовать sed:

cat filename.xxx | sed -E 's/^.*name[0-9]{2}:(.*)[0-9]{2}:piece.*$/\1/'

Проблема в том, что регулярное выражение не использует весь файл, поэтому я получаю много случайных вещей, возвращаемых в дополнение к захваченному имени файла.

Я пытался добавить префикс sed к LC_ALL=C, когда читал в другом ответе, что это будет обрабатывать все двоичные данные как «расходуемые» с подстановочными знаками, но это не имеет значения (и я, возможно, неправильно понял).

Я также пытался удалить начальный и конечный якоря, но это тоже не имеет значения.


* Файл представляет собой торрент-файл, из которого я просто хочу извлечь имя файла. Я посмотрел на кодирование и пытался извлечь имя файла, но оно показалось слишком сложным для тривиальной задачи.

1 Ответ

2 голосов
/ 23 мая 2019

Вы можете использовать

sed -n -E 's/^.*name[0-9]{2}:(.*)[0-9]{2}:piece.*$/\1/p;' filename.xxx

Здесь -n предотвращает печать строки, а p печатает совпадения (что остается после замены).

В качестве альтернативы вы можете использовать что-то вроде

grep -m 1 -o 'name[0-9]\{2\}:\(.*\)[0-9]\{2\}:piece' filename.xxx | \
   sed -E 's/^name[0-9]{2}:(.*)[0-9]{2}:piece$/\1/'

Первый grep извлечет только первое (-m 1) совпадение, а затем sed сохранит только значение группы захвата внутри результата.

...