Подтвердить что ты не робот

Как извлечь значение из строки с помощью регулярного выражения и оболочки?

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

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

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

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

Как я могу извлечь 45 в оболочке script?

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

    .*(\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'

Ответ 3

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

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

echo '12 BBQ ,45 rofl, 89 lol' | sed  's/^.*,\([0-9][0-9]*\).*$/\1/g'

Ответ 4

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

$ string="12 BBQ ,45 rofl, 89 lol"
$ echo ${string% rofl*}
12 BBQ ,45
$ string=${string% rofl*}
$ echo ${string##*,}
45

Ответ 5

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

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

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

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

Ответ 6

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

Пример:

[$] echo "12 BBQ ,45 rofl, 89 lol" | ./rextract '[,]([\d]+) rofl' '${1}'
45