Извлечение числа текстового файла с помощью bash

jj.derose спросил: 10 мая 2018 в 04:42 в: string

У меня есть переменная со следующей строкой в ​​качестве входных данных:

x}#guser{padding-bottom:7px !important;text-align:right}.gbh,.gbd{border-top:1px solid #c9d7f1;font-size:1px}.gbh{height:0;position:absolute;top:24px;width:100%}@media all{.gb1{height:22px;margin-right:>12,34 M<.5em;vertical-align:top}#gbar{float:left}}a.gb1,a.gb4{text-decoration:underline !important}a.gb1,a.gb4{color:#00c !important}.gbi .gb4{color:#dd8e27 !important}.gbf .gb4{color:#900 !important} </style><style>body,td,a,p,.h{font-family:arial,sans-serif}body{margin:0;overflow-y:scroll}#gog{padding:3px 8px 0}td{line-height:.8em}.gac_m td{line-height:17px}form{margin-bottom:20px}.h{color:#36c}.q{color:#00c}.ts td{padding:0}.ts{border-collapse:collapse}em{font-weight:bold;font-style:normal}.lst{height:25px;width:496px}.gsfi,.lst{font:18px arial,sans-serif}.gsfs{font:17px arial,sans-serif}.ds{display:inline-box;display:inline-block;margin:3px 0 4px;margin-left:4px}input{font-family:inherit}a.gb1,a.gb2,a.gb3,a.gb4{color:#11c !important}body{background:#fff;color:black}a{color:#11c;text-decoration:none}a:hover,a:active{text-decoration:underline}.fl a{color:#36c}a:visited{color:#551a8b}a.gb1,a.gb4{text-decoration:underline}a.gb3:hover{text-decoration:none}#ghead a.gb2:hover{color:#fff !important}.sblc{padding-top:5px}.sblc a{display:block;margin:2px 0;margin-left:13px;font-size:11px}.lsbb{background:#eee;border:solid 1px;border-color:#ccc #999 #999 #ccc;height:30px}.lsbb{display:block}.ftl,#fll a{display:inline-block;margin:0 12px}.lsb{background:url(/images/nav_logo229.png) 0 -261px repeat-x;border:none;color:#000;cursor:pointer;height:30px;margin:0;outline:0;

Где-то в строке мы можем найти:

>12,34 M<

Можно ли извлечь номер 12,34 и поместить его в переменную?

У меня есть несколько из этих строк, но шаблон & gt; число M & lt; всегда один и тот же.

Спасибо за предложения:)


2 ответа

Walter A David Peltier ответил: 10 мая 2018 в 05:43

вы можете попробовать прочитать введенную переменную для использования grep Regex

echo $variable | grep -Eo "[0-9,]{1,} M"   

См. комментарии: используйте <<<, чтобы избежать echo и назначить к переменной:

finalVar=$(grep -Eo '[0-9,]{1,} M' <<< "$variable") 
dmadic ответил: 10 мая 2018 в 05:19
Хорошее решение. Я не знаю, почему люди избегают здесь. Итак, с помощью здесь строк вы можете пойти с grep -Eo '[0-9,]{1,} M' <<< "$variable", но это, вероятно, вопрос личного предпочтения. Другая вещь, которую я бы сказал, - это то, что ваш ответ не является полным, поскольку он не назначен переменной. Не думайте, что тот парень, который просил, всегда знает, как это сделать.
David Peltier ответил: 10 мая 2018 в 05:24
Вы правы, я использую здесь строку, но это не учитывалось, поэтому правильный ответ должен быть finalVar = $ (grep -Eo '[0-9,] {1,} M' < < <"$ variable")
Walter A ответил: 10 мая 2018 в 05:51
Для лучшего исправления (соответствие <> и не более 1 [,]) используйте finalVar=$(grep -Eo '>[0-9]{1,}[,]{0,1}[0-9]{0,} M<' | tr -d '<>' <<< "${variable}"
Walter A ответил: 10 мая 2018 в 06:33

Если у вас есть шаблон в каждой строке, используйте

resultvar=$(sed -r 's/.*>([0-9]+[,]{0,1}[0-9]+ M)<.*/\1/' <<< "$variable") 

Если в вашем вводе более 1 строки и только одно совпадение, используйте

resultvar=$(sed -nr 's/.*>([0-9]+[,]{0,1}[0-9]+ M)<.*/\1/p' <<< "$variable") 

Если вы можете иметь несколько совпадений, укажите желаемый результат (только первое или последнее совпадение, массив, набор переменных или сообщение об ошибке).

PesaThe ответил: 10 мая 2018 в 06:13
Зачем использовать {1,} вместо + и т. Д.?
Walter A ответил: 10 мая 2018 в 06:35
@PesaThe Вы правы, я изменил {1,} на +. Я не уверен, какие из следующих чисел действительны, поэтому я дал простое решение: 1; 1, ,2.

Дополнительное видео по вопросу: Извлечение числа текстового файла с помощью bash

SED Replace More than One String Linux Shell BASH

Variable String Manipulation

Splitting Strings into Arrays - BASH - Linux