Конвертировать eGrep в Grep - PullRequest
       8

Конвертировать eGrep в Grep

1 голос
/ 27 февраля 2020

У меня есть запрос с использованием eGrep в Bash на MacOS, и я подумал, как вместо этого преобразовать его в запрос grep, насколько я понимаю, eGrep устарел или заменяется на grep?

Мне нужно преобразовать это;

egrep "^\s+2\.\d+\.\d+$" <(rbenv install -l) | tail -1

По сути, он ищет в списке установки RBENV самую последнюю версию 2.x, чтобы он мог установить ее позже, эта часть кода собирает номер версии, которая мне нужна, и сохраняет его в VAR для последующего использования;) Любая помощь будет принята с благодарностью

Ответы [ 3 ]

2 голосов
/ 27 февраля 2020

Как уже упоминали другие, egrep является устаревшей версией, эквивалентной grep -E.

Причина, по которой ваша оригинальная команда не работает в не-GNU версии grep объясняется тем, что вы используете неподдерживаемый синтаксис, такой как \s и \d. Это отдельная функция для поддержки расширенных регулярных выражений (то, что вы получаете с -E).

Попробуйте изменить \s и \d для их эквивалентного сокращенного синтаксиса:

grep -E '^[[:space:]]+2\.[[:digit:]]+\.[[:digit:]]+$' <(rbenv install -l) | tail -1

Кроме того, я бы всегда рекомендовал использовать одинарные кавычки вокруг любого строкового литерала, чтобы избежать возможности интерпретации оболочкой таких символов, как $ и \.

Для максимальной совместимости вы также можете хотите рассмотреть использование канала, а не подстановку процесса, и только использование синтаксиса регулярных выражений Basi c (т.е. замена + на \{1,\}):

version=$(rbenv install -l | 
  grep '^[[:space:]]\{1,\}2\.[[:digit:]]\{1,\}\.[[:digit:]]\{1,\}$' |
  tail -1)
2 голосов
/ 27 февраля 2020

См .: https://www.gnu.org/software/grep/manual/grep.html

egrep - синоним grep -E

fgrep - синоним grep -F

В вашем случае egrep "^\s+2\.\d+\.\d+$" <(rbenv install -l) | tail -1

просто становится

grep -E "^\s+2\.\d+\.\d+$" <(rbenv install -l) | tail -1

0 голосов
/ 27 февраля 2020

ОК, так что я понял, что последний запрос - это

latest_2x_ruby=$(grep -E "^2\.\d+\.\d+$" <(rbenv install -l) | tail -1)

. Он вернет все номера версий, начиная с 2, и выберет последнюю из списка. таким образом, я могу просто изменить номер в начале, чтобы получить последнюю версию указанной c основной версии.

Однако, если я хочу запустить это из BASH скрипта, я должен был сделать это так;

latest_2x_ruby="$( rbenv install -l | grep -E '^2\.\d+\.\d+$' | tail -1 )"
...