捕获最后XXX个字符

时间:2014-04-29 12:03:30

标签: bash sed

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

所以,使用avconv,我可以做到:

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

输出是:

[before 8 there's a space] 80 kb/s

或者可能是:

128 kb/s

将输出与脚本变量进行比较的最佳方法是什么? (if / then / elif?)

if [ $VAR1 = " 80 kb/s" ] ; then

我猜用sed或awk来捕获最后的数字值?

2 个答案:

答案 0 :(得分:1)

尝试使用以下命令提取最后一个字符串128或80 kb / s。

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

OR

sed 's/.*\ \(.*\)\ \(.*\)/\1\ \2/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

答案 1 :(得分:1)

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

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

甚至grep

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

但是,如果您需要提取匹配的模式,对于第一种情况,您可以从比较中转储匹配,如:

$ [[ ${var} =~ "80 kb/s" ]] && echo ${BASH_REMATCH}
80 kb/s

或者,对于grep

$ grep -o "80 kb/s" <<< ${var}
80 kb/s

修改: 如果您有任意值,后面跟随“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