Вот что я бы сделал:
sed -E 's / [A-Za-z _] / / г; с /. {1,} $ //; s / ^ {1,} ([0-9]) / \ 1 / '
Пример:
echo "A_b0.5_c0.654_d0.157_e1.6.out" | sed -E 's/[A-Za-z_]/ /g;s/. {1,}$//;s/^ {1,}([0-9])/\1/'
0.5 0.654 0.157 1.6
Кто-то с более высокими навыками sed
может произвести лучший один.
Первый
for (( expr1 ; expr2 ; expr3 )) ; do commands ; done
, возможно, более общий, чем второй
for name [ [in [words ...] ] ; ] do commands; done
, потому что
Вторая форма всегда конечно, первый тривиально можно превратить в бесконечный цикл:
for ((;;)); do echo $SHELL; done
Это:
for (( expr1 ; expr2 ; expr3 )) ; do commands ; done
Циклы над целыми числами, поскольку он вынужден делать это из-за того, что внутри (( ))
каждая часть (деленная на ;
) является "Арифметическим выражением".
Он похож на c
for loop, имеет начало, конец и "действие шага", определенные в одной строке, он более компактен.
Второй работает со списком слов, которые могут быть числами, строками или массивами:
for a in 1 2 3 4 5; do echo "$a"; done
for a in one two three four five; do echo "$a"; done
for a in "${one[@]}" ; do echo "$a"; done
Одна из оговорок заключается в том, что список слов подвержен shell split, что не является проблемой в первой конструкции.