Bash 捕获最后XXX个字符

Bash 捕获最后XXX个字符,bash,sed,Bash,Sed,我做了一个脚本(avconv)重新编码我的mp3文件,我想添加一个检查(如果我尝试重新编码到我选择的相同比特率,脚本必须跳过该文件) 因此,使用avconv,我可以: avconv -i mp3test.mp3 2>&1 |grep Audio|tail -c 09 输出为: [before 8 there's a space] 80 kb/s 或者可能是: 128 kb/s 将输出与脚本变量进行比较的最佳方法是什么?(如果/那么/如果?) 我想应该使用sed或awk来捕获最

我做了一个脚本(avconv)重新编码我的mp3文件,我想添加一个检查(如果我尝试重新编码到我选择的相同比特率,脚本必须跳过该文件)

因此,使用avconv,我可以:

avconv -i mp3test.mp3 2>&1 |grep Audio|tail -c 09
输出为:

[before 8 there's a space] 80 kb/s
或者可能是:

128 kb/s
将输出与脚本变量进行比较的最佳方法是什么?(如果/那么/如果?)


我想应该使用sed或awk来捕获最后一个数字值?

尝试下面的命令来提取最后一个字符串128或80 kb/s

sed 's/.*\ \(.*\) kb\/s/\1\ kb\/s/g'

例如:

$ echo "[before 8 there's a space] 80 kb/s" | sed 's/.*\ \(.*\) kb\/s/\1\ kb\/s/g'
80 kb/s
$ echo "[before 8 there's a space] 80 kb/s" | sed 's/.*\ \(.*\)\ \(.*\)/\1\ \2/g'
80 kb/s

好的,考虑到您已经将输出分配给变量,比如说
var
,如果您只是想检测变量中是否存在给定的信息,您可以使用匹配:

$ if [[ ${var} =~ "80 kb/s" ]]; then ...; else ...; fi
甚至
grep

$ if [[ $(grep -c "80 kb/s" <<< ${var}) -ge 1 ]]; then ...; else ...; fi
$ grep -o "80 kb/s" <<< ${var}
80 kb/s
或者,对于
grep

$ if [[ $(grep -c "80 kb/s" <<< ${var}) -ge 1 ]]; then ...; else ...; fi
$ grep -o "80 kb/s" <<< ${var}
80 kb/s

感谢您的回复,我认为最好尝试捕捉类似于数字的值,这样我可以与数字进行比较,即:如果VAR1>75且<85,则转换为80 Kb/s。有时我会发现一些mp3文件的比特率很奇怪,比如78或82。谢谢如果您可以访问实用程序
mp3info
(可在Ubuntu/Debian上获得)或类似的工具,那么这可能比解析
avconv
的输出要好。例如,使用
mp3info
可以在变量
var
中轻松获得比特率,只需:
var=$(mp3info-p“%r”mp3test.mp3)
。有了这些实用程序,您就可以非常轻松地获得有关文件的大量信息,而无需繁琐的解析。此外,人们通常不鼓励使用
avconv
。改用原始的*
ffmpeg
。(*来自www.ffmpeg.org)。好吧,
avconv
已经在较旧的版本中脱离了
ffmpeg
主流。
$ grep -o "80 kb/s" <<< ${var}
80 kb/s
$ var="[before 8 there's a space] 80 kb/s"
$ [[ ${var} =~ ([0-9]*)" kb/s" ]] && value=${BASH_REMATCH[1]}
$ [[ $value -ge 75 && $value -le 85 ]] && echo "$value kb/s in range 75-85 kb/s"
80 kb/s in range 75-85 kb/s