Как извлечь значение из строки с помощью regex и оболочки?

Я нахожусь в оболочке, и у меня есть эта строка: 12 BBQ ,45 rofl, 89 lol

Используя regexp: \d+ (?=rofl), Я хочу 45 в результате.

Это корректно для использования regex для извлечения данных из строки? Лучшее, которое я сделал, должно выделить значение в части regex редактора онлайн. Большую часть времени это удаляет значение из моей строки.

Я занимаюсь расследованиями expr, но все, что я получаю, является синтаксическими ошибками.

Как мне может удаться извлечь 45 в сценарии оболочки?

33
задан Tomalak 23 July 2010 в 16:54
поделиться

5 ответов

Вы можете сделать это с помощью режима Perl GNU grep:

echo "12 BBQ ,45 rofl, 89 lol"|grep -P '\d+ (?=rofl)' -o

-P означает стиль Perl, а -o означает только совпадение.

51
ответ дан 27 November 2019 в 18:01
поделиться

Да, регулярное выражение, безусловно, можно использовать для извлечения части строки. К сожалению, разные варианты * nix и разные инструменты используют немного разные варианты Regex.

Эта команда sed должна работать на большинстве разновидностей (протестировано на OS / X и Redhat)

echo '12 BBQ ,45 rofl, 89 lol' | sed  's/^.*,\([0-9][0-9]*\).*$/\1/g'
13
ответ дан 27 November 2019 в 18:01
поделиться

Кажется, что вы спрашиваете о нескольких вещах. Чтобы ответить на них:

  • Да, можно извлекать данные из строки с помощью регулярных выражений, для этого они и существуют
  • Вы получаете ошибки, какую из них и какой инструмент оболочки вы используете?
  • Вы можете извлечь числа, заключив их в круглые скобки:

    .*(\d+) rofl.*
    

    и используя $1 для извлечения строки (.* - для "остальные до и после в одной строке)

На примере sed идея выглядит так: заменить все строки в файле только подходящим числом:

sed -e 's/.*(\d+) rofl.*/$1/g' inputFileName > outputFileName

или:

echo "12 BBQ ,45 rofl, 89 lol" | sed -e 's/.*(\d+) rofl.*/$1/g'
8
ответ дан 27 November 2019 в 18:01
поделиться

Вы можете использовать оболочку (например, bash)

$ string="12 BBQ ,45 rofl, 89 lol"
$ echo ${string% rofl*}
12 BBQ ,45
$ string=${string% rofl*}
$ echo ${string##*,}
45
0
ответ дан 27 November 2019 в 18:01
поделиться

Вы, безусловно, можете извлечь эту часть строки, и это отличный способ разобрать данные. Синтаксис регулярных выражений сильно различается, поэтому вам нужно ссылаться на файл справки для используемого вами регулярного выражения. Вы можете попробовать такое регулярное выражение, как:

[0-9]+ *[a-zA-Z]+,([0-9]+) *[a-zA-Z]+,[0-9]+ *[a-zA-Z]+

Если ваша программа с регулярным выражением может выполнять замену строки, замените всю строку желаемым результатом, и вы можете легко использовать этот результат.

Вы не упомянули, используете ли вы bash или другую оболочку. Это поможет получить более точные ответы при обращении за помощью.

-1
ответ дан 27 November 2019 в 18:01
поделиться
Другие вопросы по тегам:

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