bash, извлекающий информацию id3 - PullRequest
0 голосов
/ 13 марта 2012

Я работаю над сценарием, который отображает информацию тега id3 в mp3 файлах для школы.Мне удалось получить последнюю строку, но у меня были проблемы с получением метаданных.

Метаданные начинаются со строки TAG.Мой скрипт получает позицию этой строки, а затем пытается извлечь строку, начинающуюся с этой позиции.

То, что выводится, было последней строкой, но перед началом метаданных.

Я изменил номера, но выход не изменился, за исключением одного.File1, когда я намеренно извлекаю из позиции 76, что меньше, чем соответствие, я получаю еще несколько символов, как я ожидал.

сценарий

for f in *.mp3
do
  echo;
  echo;
  echo  the last line of the file is;
  lastLine=`tail -1 $f`
  echo $lastLine;
  echo;
  pos=`expr index "$lastLine" TAG`;
  echo  match is found at pos $pos;
  echo getting the string starting at pos 122;
  echo ${lastLine:122}
  echo;
  echo getting the string starting at pos 150;
  echo ${lastLine:150}
  echo;
  echo getting the string starting at pos 76;
  echo ${lastLine:76}
  echo;
done

вывод из 2 разных mp3файлы

enter image description here enter image description here

Ответы [ 4 ]

0 голосов
/ 13 марта 2012

Как насчет

#!/usr/bin/env bash

boff=3
bytes=3
tag=$(tail -c "$boff" "$1" | head -c "$bytes")

while [ "$tag" != "TAG" ] ; do
    let boff+=1
    tag=$(tail -c "$boff" "$1" | head -c "$bytes")
done

tail -c "$boff" "$1"

Извлечь из TAG в конец файла?Затем вы можете фильтровать, сколько вам нужно.

0 голосов
/ 13 марта 2012

Вы можете echo до strings, чтобы избавиться от этих непечатных символов

$ echo -e '\x87hello\x99' | strings
hello
0 голосов
/ 13 марта 2012

Вам лучше использовать что-то вроде этого:

#!/bin/bash

for f; do
  echo -e "\n\n\nthe last line of the file is"
  lastLine=$(strings $f | tail -1)
  echo $lastLine
  echo
  pos=$(expr index "$lastLine" TAG)
  cat<<EOF
  match is found at pos $pos
  getting the string starting at pos 122
  ${lastLine:122}

  getting the string starting at pos 150
  ${lastLine:150}

  getting the string starting at pos 76
  ${lastLine:76}
EOF
done

тогда

./script *mp3

Использует strings см. man 1 strings

0 голосов
/ 13 марта 2012

Синтаксический анализ двоичных данных может стать настоящей неприятностью для сценариев оболочки, особенно когда фактическое кодирование не определено, как для тегов ID3.Как предложил php-кодер, вы можете использовать инструмент, который сделает за вас обработку.

...