bash извлечь строку версии и преобразовать в точку версии - PullRequest
0 голосов
/ 06 августа 2020

Я хочу извлечь строку версии (1_4_5) из my-app-1_4_5.img, а затем преобразовать ее в версию с точкой (1.4.5) без имени файла. Строка версии будет состоять из трех (1_4_5) или четырех (1_4_5_7) сегментов.

Работает ли этот лайнер ls my-app-1_4_5.img | cut -d'-' -f 3 | cut -d'.' -f 1 | tr _ .

Хотелось бы знать, есть ли лучший способ вместо вывода по конвейеру из cut.

Ответы [ 6 ]

3 голосов
/ 06 августа 2020

Вот попытка расширения параметров. Я предполагаю, что у вас есть шаблон подстановки, который вы хотите использовать для l oop.

for file in *-*.img; do
    base=${file%.img}
    ver=${base##*-}
    echo "${ver//_/.}"
done

Конструкция ${var%pattern} возвращает переменную var с обрезанным суффиксом pattern. Точно так же ${var#pattern} обрезает любой префикс, соответствующий pattern. В обоих случаях при дублировании оператор переключается на обрезку самого длинного совпадения вместо самого короткого. (Это POSIX-совместимое расширение pattenr, т.е. не строго Bash.) Конструкция ${var/pattern/replacement} заменяет первое совпадение в var на pattern на replacement; удвоение первого sla sh приводит к замене каждого совпадения. (Это только Bash.)

2 голосов
/ 06 августа 2020

Предполагая, что номер версии всегда будет находиться между последним da sh и расширением файла, вы можете использовать что-то вроде этого в чистом виде Bash:

name="file-name-x-1_2_3_4_5.ext"
version=${name##*-}
version=${version%%.ext}
version=${version//_/.}
echo $version

Приведенный выше код приведет к:

1.2.3.4.5

Для полного объяснения использованных выше расширений фигурных скобок, пожалуйста, посмотрите Bash Справочное руководство: 3.5.1 Расширение фигурных скобок .

2 голосов
/ 06 августа 2020

Вы можете сделать это с помощью sed :

sed -E "s/.*([0-9]+)_([0-9]+)_([0-9]+).*/\1.\2.\3/" <<< my-app-1_4_5.img
1 голос
/ 06 августа 2020

С bash и регулярным выражением:

echo "my-app-1_4_5.img" | while IFS= read -r line; do [[ "$line" =~ [^0-9]([0-9_]+)[^0-9] ]] && echo "${BASH_REMATCH[1]//_/.}"; done

Вывод:

1.4.5
1 голос
/ 06 августа 2020

Удалите все, кроме 0 до 9, _ и новой строки, а затем замените все _ на .:

echo "my-app-1_4_5.img" | tr -cd '0-9_\n' | tr '_' '.'

Вывод:

1.4.5
0 голосов
/ 06 августа 2020

Немного укороченный вариант

name=my-app-1_4_5.img
vers=${name//[!0-9_]}
$ echo ${vers//_/.}
1.4.5
...