从周围纹理不规则的线条中提取浮点数

2024-09-25 08:27:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含以下内容的文本文件:

[silencedetect @ 0x7fa73cd000c0] silence_start: 1.32515
[silencedetect @ 0x7fa73cd000c0] silence_end: 1.88188 | silence_duration: 0.556735
[silencedetect @ 0x7fa73cd000c0] silence_start: 2.99698
[silencedetect @ 0x7fa73cd000c0] silence_end: 3.42311 | silence_duration: 0.426122
[silencedetect @ 0x7fa73cd000c0] silence_start: 5.58311
[silencedetect @ 0x7fa73cd000c0] silence_end: 6.13984 | silence_duration: 0.556735
[silencedetect @ 0x7fa73cd000c0] silence_start: 7.6729
size=N/A time=00:00:09.12 bitrate=N/A speed= 675x 

我想提取“silence\u start:”和“silence\u end:”位后面的值(即值1.32515,1.88188,…,7.6729)以及“time=”(即00:00:09.12)后面的值。你知道吗

我是grep/sed/awk的新手,正在尝试学习如何使用它们中的一个来做到这一点,但在挣扎之后,这一切都没有发生。我尝试过各种各样的想法,也上网看了看,但成功总是离我而去。Python的建议/解决方案也很好。我也试过了,结果一团糟。你知道吗

有人能帮忙吗?我会非常感激的…提前谢谢你!!你知道吗


Tags: sizetimestartgrepsed建议endduration
3条回答

对于GNU grep和Perl regular expression-P):

grep -Po '(silence_start: |silence_end: |time=)\K[0-9:.]+' file

输出:

1.32515
1.88188
2.99698
3.42311
5.58311
6.13984
7.6729
00:00:09.12

sed解决方案:

sed -E 's/.*(silence_(start|end): |time=)([^[:space:]]+).*/\3/' file
  • \3-指向第三个带圆括号的(...)

输出:

1.32515
1.88188
2.99698
3.42311
5.58311
6.13984
7.6729
00:00:09.12

gnuawk解决方案:

 cat tst.awk
 {  s=gensub(/.*(time=|silence_(start|end): )([0-9.:]+).*/, "\\3", "g");
    print s
 }

解释正则表达式:

.*                              # anything
(                               # group 1 start
  time=                         # matching string "time="
  |                             # OR
  silence_(start|end):          # matching string "silence_start: "
                                # or "silence_end: " 
)                               # group 1 end
(                               # group 3 start
  [0-9.:]+                      # combination of number, "." and ":"
)                               # group 3 end
.*                              # anything

您可以将其用作:

$ awk -f tst.awk input.txt
1.32515
1.88188
2.99698
3.42311
5.58311
6.13984
7.6729
00:00:09.12

或作为一个班轮:

 awk '{s=gensub(/.*(time=|silence_(start|end): )([0-9.:]+).*/, "\\3", "g"); print s}' input.txt

相关问题 更多 >