我正在编写一个脚本,显示学校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文件的输出
答案 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提取到文件末尾?然后,您可以根据需要进行过滤。