это как объяснение ниже вариантов вызова, для вас совпадает:
Дважды погрузиться, не принесет вам никакой выгоды. Я бы пошел на использование eEgrep в сочетании с регулярным выражением, который соответствует вам необходимости.
ps ax | egrep '(a.*){2}'
Это даст вам все процессы, которые имеют «A» дважды. Конечно, вы можете использовать, что на любом виде входных данных Exep можно прочитать.
С регулярными выражениями вы можете либо обратно A (
( () )
) или вы можете указать, что совпадение должно {
Повторите }
Это. Разница между одним и другим важна. Для простого примера рассмотрим строку:
baa
... При сопоставлении против следующих двух шаблонов:
\([ba]\)\{2\}
\([ba]\)\1
для первого из этих группировков на самом деле не имеет значения, потому что шаблон поиск одного символа - при определении повторений группировка Только важно только в том, что он может содержать целое подсыщение, к которому может относиться повторение. И так, для этого простого примера чехол ...
[ba]\{2\}
... и ...
\([ba]\)\{2\}
... являются синонимом и могут быть предприняты, чтобы означать, что механизм Match должен искать левую и длинную строку в входе, что Состоит из двух персонажей - либо из B или A . Повторение применяется к шаблону , что делает матч и не к содержимому содержимое совпадения. Так что буквально означает:
[ba][ba]
.... Точно так же ...
\(a.*\)\{2\}
... значит ...
a.*a.*
... Что будет работать хорошо для одного персонажа A Но что не является хорошим примером того, как соответствовать подобранной строке во второй раз.
Для нашего входного образца это получает ...
ba
Но задняя ссылка очень отличается - это ссылка на содержание матча . Простой пример корпуса получает ...
aa
... потому что это самая левая и длинная строка в входе, которая состоит из символа, который соответствует структуре подключения [BA]
, и который сразу же сопровождается сам - не шаблон, который соответствует символу.
Итак, вы хотите:
\(pattern\).*\1
, потому что регулярное выражение шаблон и строка, которую она совпадает с тем, не одинаковыми - иначе у нас не было бы много призывов использовать регулярные выражения в первую очередь. Чтобы продемонстрировать разницу с немного более сложным примером ввода. Рассмотрим следующее:
printf %s\\n 123ABC321 123ABC123 321ABC321 |
grep '\([123]\{3\}.*\)\{2\}'
GREP
выше будет печать:
123ABC321
123ABC123
321ABC321
... потому что в каждом случае шаблон успешно совпадают дважды. Но если бы линию строки
были заменены:
grep '\([123]\{3\}\).*\1'
... это только печатает ...
123ABC123
321ABC321