2015-04-01 2 views
0

Итак, я запустил команду curl и grep для ключевого слова.Номер извлечения, встроенный в строку

Здесь (дезинфицировать) Результат:

...Dir');">Town/Village</a></th><th><a href="javascript:SetFilter(3,'ListPublicASDF','ASDFDir');">Phone Number</a></th></tr><tr class="rowodd"><td><a href="javascript:calldialog('ASDF','&Mode=view&helloThereId=42',600,800);"... 

Я хочу, чтобы получить номер 42 - в командной строке один лайнер будет большим.

  • поиск строки helloThereId=
  • извлечь номер прямо рядом с ним (42 в предыдущем случае)

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

ответ

4

Вы можете использовать grep с включенным параметром -P (Perl-Regexp).

$ grep -oP 'helloThereId=\K\d+' file 
42 
$ grep -oP '(?<=helloThereId=)\d+' file 
42 

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

Ссылки:

+0

Очень приятно! Он выделяет 42, но он все еще печатает большую длинную строку? – Eamorr

+0

Вы включили параметр '-o'? –

+0

Фактически, он работает сейчас. Я использовал «-P». Он отлично работает с «-oP». – Eamorr

2

Если grep версия поддерживает -P, (как это верно для ОР, учитывая, что они» re на Linux, который c omes with GNUgrep), Avinash Raj's answer - путь.

Для потенциальной пользы будущих читателей, здесь альтернативы:

Если ваш grep не поддерживает -P, но делает поддержки -o, вот прагматичное решение, которое просто извлекает номер из общего матча на 2-ом этапе, путем разделения входного на поля по =, используя cut:

grep -Eo 'helloThereId=[0-9]+' in | cut -d= -f2 file 

Наконец, если ваш grep не поддерживает ни -P ни -o, используйте sed: Вот POSIX-совместимой альтернатива, используя sed с основным регулярного выражения (отсюда и необходимость подражать + с \{1,\} и избежать скобок):

sed -n 's/.*helloThereId=\([0-9]\{1,\}\).*/\1/p' file 
+2

Вы также можете использовать '[0-9] [0-9] *' для такого же эффекта без добавления беспорядочных обратных косых черт –

+2

@JID: Thanks; это определенно вариант в этом простом случае, но '\ {1, \}' удобен в более сложных случаях, и ему нужен лучший PR :) (_GNU_ 'sed' реализует' \ + ', что заставляет людей поверить, что он переносится, но это не так.) – mklement0

1

Это будет работать с любым sed на любой ОС UNIX, даже до по умолчанию POSIX sed в Solaris:

$ sed -n 's/.*helloThereId=\([0-9]*\).*/\1/p' file 
42 
+1

Итак, pre-POSIX по умолчанию 'sed' на Solaris не поддерживает' \ {1, \} '? Если нет, предложение @ JID должно работать: используя '[0-9] [0-9] *' для эмуляции '+'. (Ваше решение будет соответствовать _пустой строке_, если 'helloThereId =' is_not_, а затем цифры и вывод '\ n'.) – mklement0

+1

Исправить, поместив обратную косую черту перед метасимволами ERE, чтобы включить их функциональность в инструменты, поддерживающие BRE, не были частью BRE до недавнего времени. Если вы придерживаетесь обратную косую черту перед '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''. OP не дал нам никаких оснований думать, что когда-либо случается, когда 'helloThereId =' не сопровождается числом, поэтому нет причины усложнять сценарий. Если такой случай существует, OP должен добавить входной случай, чтобы показать его. –

+1

Полезно знать, спасибо. Повторное усложнение регулярного выражения: справедливая точка; любой, кто действительно нуждается в более надежном решении, может извлечь его из этих комментариев. – mklement0

Смежные вопросы