Извлечь подстроку перед точкой
Я пытаюсь вычесть первую строку перед dot
(.
) в баш.
Например:
1.2.3 -> 1
11.4.1 -> 11
Я использовал следующую команду на основе документов:
s=4.5.0
echo "${s%.*}"
Но это выходы 4.5
вместо 4
, Я не понимаю
Это почему?
3 ответа
Решение
Вам нужно использовать %%
удалить самое длинное совпадение с конца:
$ echo "${s%%.*}"
4
Из документов:
${parameter%%word}
Удалить самый большой шаблон суффикса. Слово должно быть расширено, чтобы произвести образец. Расширение параметра должно затем привести к параметру с наибольшей частью суффикса, совпадающей с удаленным шаблоном.
Вы также можете использовать bash
Функция регулярных выражений встроена в последние версии оболочки (поскольку bash 3.0
), используя тильду (=~
) оператор.
$ string="s=4.5.0"
$ [[ $string =~ =([[:alnum:]]+).(.*) ]] && printf "%s\n" "${BASH_REMATCH[1]}"
4
$ string="s=32.5.0"
$ [[ $string =~ =([[:alnum:]]+).(.*) ]] && printf "%s\n" "${BASH_REMATCH[1]}"
32
В качестве альтернативы вы можете использовать cut
s=4.5.0
echo $s | cut -d '.' -f 1