Я пытаюсь записать команду 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
Никакие хиты
Если Вы хотите +
иметь в виду "один или несколько из предыдущего атома", затем необходимо сделать один из:
Использование -E
(Расширенные регулярные выражения) (или -P
, PCRE):
grep -E 'data=[a-z,0-9,\"]+' file
Escape +
так, чтобы рассматривался особенно в Основных Регулярных выражениях, используемых по умолчанию в grep
:
grep 'data=[a-z,0-9,"]\+' file
Другая опция состоит в том, чтобы использовать egrep:
egrep 'data=[a-z,0-9,\"]+' file
egrep связывается grep, это - просто обертка для grep:
#!/bin/sh
exec grep -E "$@"
это хорошо для интерактивного использования. Однако в сценариях я использовал бы grep -E
.
Точки:
+
ДО (Расширенное регулярное выражение) маркер, который указывает на один или несколько из предыдущего маркера, может использоваться если -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