bash提取id3信息

时间:2012-03-13 07:50:33

标签: bash shell substring id3

我正在编写一个脚本,显示学校mp3文件的id3标记信息。 我已经能够获得最后一行,但在获取元数据方面遇到了麻烦。

元数据以字符串TAG开头。我的脚本获取该字符串的位置,然后尝试从该位置开始提取行。

输出的是最后一行但是在元数据开始之前。

我更改了数字,但输出没有变化,但有一个例外。 File1当我故意从pos 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

3 个答案:

答案 0 :(得分:0)

解析二进制数据可能是shell脚本的真正含义,特别是当实际编码未定义时,与ID3标签一样。正如php-coder提出的那样,你可能想要使用一个为你处理的工具。

答案 1 :(得分:0)

你最好使用这样的东西:

#!/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

答案 2 :(得分:0)

怎么样

#!/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提取到文件末尾?然后,您可以根据需要进行过滤。