Ответ 1
Вы можете сделать это с помощью режима GNU grep perl:
echo "12 BBQ ,45 rofl, 89 lol"|grep -P '\d+ (?=rofl)' -o
-P
означает стиль Perl, а -o
означает только совпадение.
Я в оболочке, и у меня есть эта строка: 12 BBQ ,45 rofl, 89 lol
Используя regexp: \d+ (?=rofl)
, я хочу 45
в результате.
Правильно ли использовать регулярное выражение для извлечения данных из строки? Лучшее, что я сделал, это выделить значение в редакторе онлайн-регулярных выражений. Большую часть времени он удаляет значение из моей строки.
Я изучаю expr
, но все, что я получаю, это синтаксические ошибки.
Как я могу извлечь 45 в оболочке script?
Вы можете сделать это с помощью режима GNU grep perl:
echo "12 BBQ ,45 rofl, 89 lol"|grep -P '\d+ (?=rofl)' -o
-P
означает стиль Perl, а -o
означает только совпадение.
Кажется, что вы задаете несколько вопросов. Чтобы ответить на них:
Вы можете извлечь числа, поймав их в скобках:
.*(\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'
Да, регулярное выражение может быть использовано для извлечения части строки. К сожалению, различные варианты * nix и разных инструментов используют несколько разные варианты Regex.
Эта команда sed должна работать на большинстве вариантов (протестировано на OS/X и Redhat)
echo '12 BBQ ,45 rofl, 89 lol' | sed 's/^.*,\([0-9][0-9]*\).*$/\1/g'
вы можете использовать оболочку (например, bash)
$ string="12 BBQ ,45 rofl, 89 lol"
$ echo ${string% rofl*}
12 BBQ ,45
$ string=${string% rofl*}
$ echo ${string##*,}
45
Вы можете, конечно, извлечь эту часть строки, и это отличный способ разобрать данные. Синтаксис регулярных выражений сильно варьируется, поэтому вам нужно ссылаться на файл справки для регулярного выражения, которое вы используете. Вы можете попробовать регулярное выражение, например:
[0-9]+ *[a-zA-Z]+,([0-9]+) *[a-zA-Z]+,[0-9]+ *[a-zA-Z]+
Если ваша программа regex может выполнять замену строки, замените всю строку на результат, который вы хотите, и вы можете легко использовать этот результат.
Вы не упомянули, используете ли вы bash или какую-либо другую оболочку. Это поможет получить более качественные ответы при обращении за помощью.
Вы можете использовать rextract для извлечения с использованием регулярного выражения и форматирования результата.
Пример:
[$] echo "12 BBQ ,45 rofl, 89 lol" | ./rextract '[,]([\d]+) rofl' '${1}'
45