Regex, который будет grep-номера после определенной строки

Итак, у меня есть строка:

ID: 54376 

Можете ли вы помочь мне создать регулярное выражение, которое будет возвращать номера без «ID:»?

ПРИМЕЧАНИЕ. Эта строка находится в файле.

  • Возврат результата из Perl Regex
  • регулярное выражение шаблона для правила перезаписи apache
  • Расширение списка, разделенного запятыми, на отдельные строки
  • Извлечение подмножества строк файла на основе регулярного выражения для первой и последней строки
  • захватить текст по шаблону с началом и конечным тегом в нескольких строках
  • Поиск текста между двумя конкретными символами или строками
  • Перемещайте каждую строку до конца строки, содержащей символ
  • Команда командной строки для добавления пробела к регулярному выражению
  • 7 Solutions collect form web for “Regex, который будет grep-номера после определенной строки”

    Попробуй это:

     grep -oP '(?<=ID: )[0-9]+' file 

    или:

     perl -nle 'print $1 if /ID:.*?(\d+)/' file 

    Есть много способов сделать это. Например:

    1. Используйте GNU grep с последними PCRE и сопоставьте номера после ID: ::

       grep -oP 'ID:\s*\K\d+' file 
    2. Используйте awk и просто напечатайте последнее поле всех строк, начинающихся с ID:

       awk '/^ID:/{print $NF}' file 

      Это также будет печатать поля, которые не являются номерами, но для получения только чисел и только во втором поле используйте

       awk '($1=="ID:" && $2~/^[0-9]+$/){print $2}' file 
    3. Используйте GNU grep с расширенными регулярными выражениями и проанализируйте его дважды:

       grep -Eo '^ID: *[0-9]+' file | grep -o '[0-9]*' 
     sed -n '/ID: 54376/,${s/[^ 0-9]*//g;/./p}' 

    Это будет печатать только все числа и пробелы, возникающие после ID: 54376 в любом входе файла.

    Я только что обновил приведенное выше немного, чтобы сделать его немного быстрее с помощью * а не сбрасывать пустые строки после удаления символов {numeric, space}.

    Он адресует строки из regex /ID: 54376/ , через $ last и на них s/// удаляет все или любые * символы ^ not [^ 0-9]* затем p rints / any / line с a . символ остается.

    DEMO:

     { echo line printf 'ID: 54376\nno_nums_or_spaces\n' printf '%s @nd 0th3r char@cter$ %s\n' $(seq 10) echo 'ID: 54376' } | sed -n '/ID 54376/,${s/[^ 0-9]*//g;/./p}' 

    ВЫВОД:

      54376 1 03 2 3 03 4 5 03 6 7 03 8 9 03 10 54376 

    Используйте egrep с -o или grep с параметром -Eo для получения только согласованного сегмента. Используйте [0-9] как регулярное выражение, чтобы получить только числа:

     grep -Eo [0-9]+ filename 

    Использование sed:

     { echo "ID: 1" echo "Line doesn't start with ID: " echo "ID: Non-numbers" echo "ID: 4" } | sed -n '/^ID: [0-9][0-9]*$/s/ID: //p' 

    -n – «ничего не печатать по умолчанию», /^ID: [0-9][0-9]*$/ is «для строк, соответствующих этому регулярному выражению» (начинается с «ID:», затем 1 или больше цифр, затем конец строки), а s/ID: //p имеет форму s/pattern/repl/flagss означает, что мы делаем замену, чтобы заменить шаблон "ID: " заменой текст "" (пустая строка) с использованием флага p , что означает «распечатать эту строку после выполнения замены».

    Вывод:

     1 4 

    Другая команда GNU sed,

     sed -nr '/ID: [0-9]+/ s/.*ID: +([0-9]+).*/\1/p' file 

    Он печатает любое число после ID:

    Используйте grep + awk:

      grep "^ID" your_file | awk {'print $2'} 

    Бонус: легко читается 🙂

    Linux и Unix - лучшая ОС в мире.