Я хочу получить номер версии (n.n.n) из файла (yaml), который следует за строкой.
sdk: ">=0.2.4 <3.1.1"
version: ^2.3.1
sdk: flutter
version: 1.0.0+1
sed -n '/version:/p sample.yaml
который возвращает строку для предоставленной строки «версия:», затем я передал это в другую команду grep, чтобы шаблон соответствовал строке для номера версии:
sed -n '/version:/p sample.yaml | grep -oP '(\[0-9\]+).(\[0-9\]+).(\[0-9\]+)'
Я хотел бы посмотреть, есть ли более эффективный способ сделать это, и если string = 'sdk' из примера возвращаемое значение возвращает оба, когда я хочу вернуть одно значение.
Что касается I would like to return a single value - какое значение и по каким критериям?
Ожидаемый результат @HaiVu: «Я хочу получить номер версии (n.n.n) из файла (yaml)»





Используйте awk
awk '/version:/ {
pos=match($2, /[0-9]+\.[0-9]+\.[0-9]+/);
print substr($2, pos, RLENGTH); }' sample.yaml
match() возвращает позицию в поле, где находится регулярное выражение, и устанавливает RLENGTH его длину.
спасибо, это не сработало для version: 1.0.0+1, так как оно вернулось 1.0.01. Извиняюсь, я не понял, что пропустил : в последней версии в разделе образцов.
Ты можешь использовать
sed -nE 's/.*version:[^0-9]*([0-9][0-9.]*).*/\1/p' file
grep -oP 'version:\D*\K\d[\d.]*' file
См. онлайн демо:
#!/bin/bash
s='sdk: ">=0.2.4 <3.1.1"
version: ^2.3.1
sdk: flutter
version 1.0.0+1'
sed -nE 's/.*version:[^0-9]*([0-9][0-9.]*).*/\1/p' <<< "$s"
# => 2.3.1
grep -oP 'version:\D*\K\d[\d.]*' <<< "$s"
# => 2.3.1
Регулярное выражение version:\D*\K\d[\d.]*grep соответствует подстроке version:, затем любому нулю или более нецифр (с \D*), затем опускает совпадающий текст (с \K), затем сопоставляет и возвращает цифру, а затем любые ноль или более цифр или точек (с \d[\d.]*) .
Шаблон sed POSIX ERE (см. параметр -E, включающий этот вариант регулярного выражения) соответствует
.* - любой текстversion: - фиксированная подстрока[^0-9]* - ноль или более нецифр([0-9][0-9.]*) - Группа 1 (\1): цифра, а затем ноль или более цифр или точек.* - любой текст.Все совпадение заменяется значением группы 1, флаг p печатает результат успешной замены (-n подавляет вывод строки по умолчанию).
Каков ваш ожидаемый результат?