Проблемы с “+” в grep

Я пытаюсь записать команду grep для нахождения строк как ниже в файле крупного текста:

<div class="node_thumbnail" data-type="file" name="GOPR0036.MP4_frame000001.jpg" data="813334c25191468c9f1c57afc99fde60" aid="133948" rel="/Files/ToolTipView?fileId=813334c25191468c9f1c57afc99fde60&pageNo=1&NoCache=101016083044" rev="topMiddle">

но + символ, кажется, вызывает проблемы в ниже команд:

 grep 'data=[a-z,0-9,\"]' file

Много хитов

 grep 'data=[a-z,0-9,\"]+' file

Никакие хиты

7
задан 10 October 2016 в 21:31

3 ответа

Если Вы хотите + иметь в виду "один или несколько из предыдущего атома", затем необходимо сделать один из:

  1. Использование -E (Расширенные регулярные выражения) (или -P, PCRE):

    grep -E 'data=[a-z,0-9,\"]+' file
    
  2. Escape + так, чтобы рассматривался особенно в Основных Регулярных выражениях, используемых по умолчанию в grep:

    grep 'data=[a-z,0-9,"]\+' file
    
14
ответ дан 23 November 2019 в 06:10

Другая опция состоит в том, чтобы использовать egrep:

egrep 'data=[a-z,0-9,\"]+' file

egrep связывается grep, это - просто обертка для grep:

#!/bin/sh
exec grep -E "$@"

это хорошо для интерактивного использования. Однако в сценариях я использовал бы grep -E.

-1
ответ дан 23 November 2019 в 06:10

Точки:

  • + ДО (Расширенное регулярное выражение) маркер, который указывает на один или несколько из предыдущего маркера, может использоваться если -E опция grep используется или с завершенным (\+) в случае BRE (Основной Regex) т.е. только регулярный grep

  • Класс символов [a-z,0-9,\"] соответствовал бы любому из символов между [a-z], [0-9], , или ". Это не может быть тем, что Вы хотите

  • Обычно grep выводы целая строка, если Вы хотите произвести только подобранную часть, используют -o опция grep


На основе Вашего примера можно сделать:

grep -E '\bdata=[a-z0-9"]+\b' file
  • -E включает ДО
  • \b соответствия представляют в виде строки края, нулевую ширину
  • data= соответствия data= буквально
  • [a-z0-9"] соответствия любой символ [a-z], [0-9], и ". + соответствует предыдущему маркеру один или несколько раз

Ваш текущий шаблон даже Вы заставляете его исправить, без \b это соответствовало бы ложным положительным сторонам как foo fdata=2322ab, data=12AB и так далее.

Пример:

% grep -oE '\bdata=[a-z0-9"]+\b' <<<'<div class="node_thumbnail" data-type="file" name="GOPR0036.MP4_frame000001.jpg" data="813334c25191468c9f1c57afc99fde60" aid="133948" rel="/Files/ToolTipView?fileId=813334c25191468c9f1c57afc99fde60&pageNo=1&NoCache=101016083044" rev="topMiddle"'
data="813334c25191468c9f1c57afc99fde60
9
ответ дан 23 November 2019 в 06:10

Другие вопросы по тегам:

Похожие вопросы: