Как извлечь значение из строки с помощью регулярных выражений и оболочки? - PullRequest
31 голосов
/ 23 июля 2010

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

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

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

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

Как мне извлечь 45 в сценарии оболочки?

Ответы [ 6 ]

49 голосов
/ 23 июля 2010

Это можно сделать с помощью perl-режима GNU grep:

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

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

11 голосов
/ 23 июля 2010

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

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

echo '12 BBQ ,45 rofl, 89 lol' | sed  's/^.*,\([0-9][0-9]*\).*$/\1/g'
8 голосов
/ 23 июля 2010

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

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

    .*(\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'
0 голосов
/ 13 сентября 2016

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

Пример:

[$] echo "12 BBQ ,45 rofl, 89 lol" | ./rextract '[,]([\d]+) rofl' '${1}'
45
0 голосов
/ 23 июля 2010

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

$ string="12 BBQ ,45 rofl, 89 lol"
$ echo ${string% rofl*}
12 BBQ ,45
$ string=${string% rofl*}
$ echo ${string##*,}
45
0 голосов
/ 23 июля 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...