如何在 Bash 中从字符串中提取特定部分

如何在 Bash 中从字符串中提取特定部分

我得到了这个输出:

Duration: 00:03:27.05, start: 0.000000, bitrate: 336 kb/s

我想00:03:27.05从整个字符串中提取(值可以改变)。

到目前为止我已经尝试过:

String="Duration: 00:03:27.05, start: 0.000000, bitrate: 336 kb/s"

String="${String#*:}"
String="${String%,*,*}"
echo $String

它给出了期望的结果,但在这里我必须声明String变量两次,并且必须分别剪切字符串的特定部分。

所以我只想知道一种最简单、最直接的方法来做到这一点。

提前感谢帮助:)

答案1

您可以尝试类似以下操作awk

awk -F'[ ,]' '{print $2}' input_file

例子:

echo "Duration: 00:03:27.05, start: 0.000000, bitrate: 336 kb/s"|awk -F'[ ,]' '{print $2}'
00:03:27.05

答案2

假设这个特定的时间模式是字符串中唯一的模式,一个非常直接的方法就是简单地使用带有 -P 标志的 grep,这样我们就可以将模式解释为与 Perl 兼容的正则表达式:

String="Duration: 00:03:27.05, start: 0.000000, bitrate: 336 kb/s"

echo $String | grep -oP "[0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{2}"

这将输出00:03:27.05

答案3

Bash 允许您使用 POSIX ERE 正则表达式:

String="Duration: 00:03:27.05, start: 0.000000, bitrate: 336 kb/s"

if [[ $String =~ Duration:\ ([^,]+), ]]; then
    String=${BASH_REMATCH[1]}
fi

在普通的 Bourne shell 中,/bin/expr标准工具是:

expr "$String" : 'Duration: \([^,]*\),'

(请注意,expr 使用 BRE 正则表达式语法而不是 ERE,因此分组使用\( \)+运算符不可用。此外,expr 的正则表达式隐式锚定到字符串的开头,而=~搜索则在字符串中的任何位置。)

相关内容