Выберите значение с регулярным выражением - PullRequest
0 голосов
/ 06 февраля 2019

Я мало знаю о регулярных выражениях, поэтому я хотел бы знать, можете ли вы выбрать только максимальное значение амплитуды из этого текста, возвращаемого программой sox?В этом случае, например, я хотел бы выбрать только 0,712219

Samples read:           6615000
Length (seconds):     75.000000
Scaled by:         2147483647.0
Maximum amplitude:     0.712219
Minimum amplitude:    -0.805969
Midline amplitude:    -0.046875
Mean    norm:          0.009264
Mean    amplitude:    -0.000027
RMS     amplitude:     0.043011
Maximum delta:         0.734100
Minimum delta:         0.000000
Mean    delta:         0.008353
RMS     delta:         0.041470
Rough   frequency:         6767
Volume adjustment:        1.241

Ответы [ 4 ]

0 голосов
/ 07 февраля 2019

Печатайте только строку с соответствием и изменяйте эту строку.

sed -n '/Maximum amplitude/ s/.* //p' inputfile
0 голосов
/ 06 февраля 2019
perl -nle 'm{Maximum amplitude:\s+(-?\d?\.?\d+)} and print $1' file

0,712219

Эта функция обрабатывает числа с отрицательным знаком, а также числа без цифр, за которыми следует десятичная точка и любое количество цифр.

0 голосов
/ 06 февраля 2019

Я бы сделал это в awk:

awk '/Maximum amplitude:/ { print $NF }' infile

Этот фильтр фильтрует строки, соответствующие Maximum amplitude:, а затем печатает последнее разделенное пробелами поле этой строки.

0 голосов
/ 06 февраля 2019

^Maximum amplitude:\s*(-?\d\.\d+)\n

См. здесь

  • ^ представляет в начале строки.
  • Maximum amplitude: гарантирует, что выправильная строка
  • \s* ноль или более пробелов
  • ( ) представляет группу захвата - то, что вы хотите, чтобы регулярное выражение возвращало
  • -?необязательно означает минус
  • \d представляет одну цифру
  • \. представляет десятичное число
  • \d+ представляет 1 или более цифр
  • \n представляет символ новой строки - это вызывает разрывы строки.

Это был Perl, сгенерированный regex101.com:

use strict;

my $str = 'Samples read:           6615000
Length (seconds):     75.000000
Scaled by:         2147483647.0
Maximum amplitude:     0.712219
Minimum amplitude:    -0.805969
Midline amplitude:    -0.046875
Mean    norm:          0.009264
Mean    amplitude:    -0.000027
RMS     amplitude:     0.043011
Maximum delta:         0.734100
Minimum delta:         0.000000
Mean    delta:         0.008353
RMS     delta:         0.041470
Rough   frequency:         6767
Volume adjustment:        1.241';
my $regex = qr/^Maximum amplitude:\s*(-?\d\.\d+)\n/mp;

if ( $str =~ /$regex/g ) {
  print "Whole match is ${^MATCH} and its start/end positions can be obtained via \$-[0] and \$+[0]\n";
  # print "Capture Group 1 is $1 and its start/end positions can be obtained via \$-[1] and \$+[1]\n";
  # print "Capture Group 2 is $2 ... and so on\n";
}

# ${^POSTMATCH} and ${^PREMATCH} are also available with the use of '/p'
# Named capture groups can be called via $+{name}

Здесь - пример использования именованной группы захвата amp.

^Maximum amplitude:\s*(?P<amp>-?\d\.\d+)\n
...