Как использовать grep для извлечения текста между двумя шаблонами

#bash

#bash

Вопрос:

Я работаю со скриптом bash. Есть файл, а внутри файла он выглядит так:

 Hello /hi/12349/Jane?
Hello /hi/123?=Jane/
Hello /hey/123450/Jane
Hello /hi/123/Jane
  

И я хочу извлечь любые цифры между «Hello / hi /» и «/», а между «Hello / hi /» и «/» должны быть только цифры.
Итак, в этом случае результат, который я хочу, это:

 12349
123
  

Я пробовал это:

 cat file.txt | grep -o -P '(?>=Hello /hi/).*(?=/)'
  

Но то, что я пробовал, распечатало все после «Привет / привет»: (

Комментарии:

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

Ответ №1:

Вы можете использовать sed для этого:

 sed -nE 's|^Hello /hi/([0-9][0-9]*)/.*|1|p' file
12349
123
  

Ответ №2:

С помощью GNU grep:

 grep -Po '(?<=^Hello /hi/)[0-9] (?=/)' file.txt
  

Вывод:

12349
123

Ответ №3:

Извлечение вещей похоже на использование редактора потоков.

 sed -n '/Hello /hi/([0-9]*).*//s//1/p' file.txt
  

Ответ №4:

Другой возможностью является расширенное регулярное выражение ( -E ) …

 grep -o -E "[^][a-zA-Z /?=]{1,8}" grep.txt
  

… в этом случае используется шаблон нежелательных символов и [^] средств: not

выводит…

 12349
123
123450
123