Как к grep дважды?

[117417] От [117780]man rsync[117781]:

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

2
06.03.2015, 18:16
2 ответа

Дважды погрузиться, не принесет вам никакой выгоды. Я бы пошел на использование eEgrep в сочетании с регулярным выражением, который соответствует вам необходимости.

ps ax | egrep '(a.*){2}'

Это даст вам все процессы, которые имеют «A» дважды. Конечно, вы можете использовать, что на любом виде входных данных Exep можно прочитать.

2
27.01.2020, 22:12

С регулярными выражениями вы можете либо обратно 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
0
27.01.2020, 22:12

Теги

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