Номер Grep после пути, табуляции и пробела в строке

Конвейер вводит альтернативные зависимости:nginxзависит от одной из nginx-core, nginx-full, nginx-lightили nginx-extras. Двойные зависимости используются для указания диапазона версий. (Ограничения полной зависимости здесь не видны, что говорит о том, что они недостаточны, но nginx-core, -full, -lightи -extrasконфликтуют друг с другом, что гарантирует, что «или» в набор зависимостей представляет собой «исключающее или».)

Вы увидите это яснее, если посмотрите на вывод apt show nginx.

1
23.03.2021, 17:43
4 ответа

Если у вас есть доступ к GNUgrep(по умолчанию в системах Linux ), это регулярное выражение будет захватывать цифры без каких-либо десятичных знаков в них.

grep -oP '\b(?<!\.)\d+(?!\.)\b'

регулярное выражение Объяснение:

  • \bсоответствует границе слова
  • (?<!\.)Отрицательный просмотр назад для подтверждения отсутствия десятичной дроби(.)позади
  • \d+соответствует цифре один или несколько раз
  • (?!\.)Отрицательный просмотр вперед утверждает, что впереди нет десятичной дроби(.)
  • \bсоответствует границе слова
2
28.04.2021, 22:57

Рассматривая строку как набор полей, разделенных пробелами -, вам нужно предпоследнее поле:

num=$( awk '{ print $(NF-1) }' <<<"$s" )

или, в оболочках без здесь -строк,

num=$( printf '%s\n' "$s" | awk '{ print $(NF-1) }' )

Это подает строку из $sв команду awk. Команда awkвыводит предпоследнее поле, разделенное пробелом -. Этот результат присваивается переменной num.

Тестирование:

$ s="B /home/BL/004_010_0100.0      23      0.031"
$ num=$( awk '{ print $(NF-1) }' <<<"$s" )
$ printf 'num is "%s"\n' "$num"
num is "23"

Если ваши данные в $sпоступают из команды, вы можете напрямую передать их в awkвместо сохранения в промежуточной переменной:

num=$( some-command | awk '{ print $(NF-1) }' )

grep— это инструмент, который возвращает совпадающие строки (, игнорируя нестандартную -опцию -o, доступную в некоторых реализациях инструмента ). Мы можем использовать grepдля выбора числа, если мы сначала преобразуем строку $sв несколько строк на основе пробелов в строке:

$ tr -s '[:blank:]' '[\n*]' <<<"$s" | grep -x '[[:digit:]]\{1,\}'
23

Используемая здесь команда trизменяет строку с

B /home/BL/004_010_0100.0      23      0.031

в

B
/home/BL/004_010_0100.0
23
0.031

и команда grepвыбирает строку, которая только состоит из цифр (опция -xзаставит данный шаблон соответствовать полной строке ). Это, очевидно, будет работать только в том случае, если искомое число является положительным целым числом.

Если бы вы знали, что вас будет интересовать предпоследнее «поле», вы могли бы использовать tailи headвместо:

$ tr -s '[:blank:]' '[\n*]' <<<"$s" | tail -n 2 | head -n 1
23

...илиsed:

$ tr -s '[:blank:]' '[\n*]' <<<"$s" | sed -n -e '${ g; p; }' -e h
23

Все вышеперечисленные варианты являются стандартными и портативными. Мы также можем использовать cutдля извлечения предпоследнего поля, если используем нестандартную -утилиту revдля двойного обращения строки:

$ rev <<<"$s" | tr -s '[:blank:]' '[\t*]' | cut -f 2 | rev
23

Здесь мы также используем trдля замены всех пробельных символов табуляцией (и сжимаем их в отдельные табуляции ). Затем cutпросто извлекает второе поле перед тем, как revснова инвертирует извлеченные данные.

4
28.04.2021, 22:57

Просто немного изменил ваш grep. Если вы используете GNUgrep(по умолчанию в системах Linux ), это должно работать:

s="B /home/BL/004_010_0100.0      23      0.031"
num=$(echo $s | grep -oP '\.*?\s+\d+\s+')
0
28.04.2021, 22:57

Вы можете попробовать это с Perl:

echo "$s" | perl -e 'for(<>){/B\s+.*?\s+(\d+)\s+/;print $1}'

Здесь мы находим строку с:

  • Bсимвол
  • , за которым следует один или несколько пробелов-\s+
  • за которым следуют все ленивые символы перед первым пробелом (s)-.*?\s+
  • за которым следует желаемое число -захватить его в группе захвата в круглых скобках(\d+)-он сохраняется в $1специальной переменной
  • , за которым следует один или несколько пробелов -\s+.

Это регулярное выражение можно уточнить, (например. с операторами ^и $для указания начала и конца строки ).

Подробнее о регулярных выражениях.

4
28.04.2021, 22:57

Теги

Похожие вопросы