Извлечь подстроку перед точкой

Я пытаюсь вычесть первую строку перед 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
Другие вопросы по тегам