使用grep,egrep或带有正则表达式的sed从1行字符串中获取字符串

时间:2014-05-07 11:27:27

标签: regex macos sed terminal grep

我有一个像

这样的行字符串
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和正则表达式来获取字符串。但由于我不熟悉正则表达式,我不知道如何使用它们。请帮帮我

3 个答案:

答案 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是记录分隔符,这意味着每个逗号分隔值将被视为单独的记录。这将打印包含km后跟b/s的记录。