我有一个像
这样的行字符串Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 720x480 [SAR 32:27 DAR 16:9], 2286 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default)
我知道我可以使用cut命令获得“2286 kb / s”。
foo='Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 720x480 [SAR 32:27 DAR 16:9], 2286 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default)'
echo $foo | cut -d ',' -f 4
但是如果“2286 kb / s”的字段数不同,我就不能使用cut命令。此外,该单位可能会改为“16 mb / s”。
我认为我需要使用grep,egrep或sed和正则表达式来获取字符串。但由于我不熟悉正则表达式,我不知道如何使用它们。请帮帮我
答案 0 :(得分:3)
您可以使用grep
:
grep -oE '[0-9]+ [km]b/s' <<< "$foo"
或sed
:
sed 's|.* \([0-9]* [km]b/s\).*|\1|' <<< "$foo"
答案 1 :(得分:1)
使用grep的另一种方法:
echo $foo | tr ',' '\n' | grep -e /s$
这只是在两个逗号之间的所有内容中查找以/ s结尾的任何内容(所以mb / s,kb / s gb / s,无论如何)(我们用tr
替换了新行的逗号)
以下是演示中的演示:
➜ ~ foo='Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 720x480 [SAR 32:27 DAR 16:9], 2286 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default)'
➜ ~ echo $foo | tr ',' '\n' | grep -e /s$
2286 kb/s
答案 2 :(得分:1)
你可以像这样使用awk:
awk 'BEGIN{RS=", "}/[km]b\/s/' <<<"$foo"
RS
是记录分隔符,这意味着每个逗号分隔值将被视为单独的记录。这将打印包含k
或m
后跟b/s
的记录。