Использование powershell для поиска файлов, которые соответствуют двум отдельным регулярным выражениям - PullRequest
3 голосов
/ 12 марта 2012

Я хочу найти любой файл, который может соответствовать двум регулярным выражениям, например, все файлы, которые имеют хотя бы одно из bat, hat, cat , а также слово noun. Это будет любой файл, который может соответствовать как регулярным выражениям [bhc]at, так и noun.

Параметр regex для select-string, похоже, работает только построчно. Кажется, вы можете передать несколько шаблонов, разделенных запятыми (select-string -pattern "[bhc]at","noun"), но это соответствует одному, а не обоим.

Ответы [ 4 ]

5 голосов
/ 12 марта 2012

Вы всегда можете просто использовать два фильтра:

dir | ? {(gc $_) -match '[bhc]at'} | ?{(gc $_) -match 'noun'}

Это просто получает все объекты, которые соответствуют первому критерию, и проверяет этот набор результатов для второго. Я полагаю, что это будет быстрее, чем проверка обоих, поскольку многие файлы проверяются только один раз, а затем отфильтровываются.

3 голосов
/ 12 марта 2012

Вот тот, который требует только один get-контент:

dir | where-object{[string](get-content $_)|%{$_ -match "[bhc]at" -and $_ -match "noun"}}
2 голосов
/ 13 марта 2012

Слияние одного get-контента @ mjolinor с оптимизированной фильтрацией @ JNK дает:

dir | ?{ [string](gc $_) | ?{$_ -match "[bhc]at"} | ?{$_ -match "noun"} }

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

    | select-string -pattern "[bhc]at","noun" -allmatches
0 голосов
/ 12 марта 2012

Я придумал довольно громоздкий, но работающий:

dir | where-object{((get-content $_) -match "[bhc]at") -and ((get-content $_) -match "noun")}

Я могу сократить это с помощью псевдонимов, но есть ли более элегантный способ, желательно с меньшим количеством нажатий клавиш?

Мой другой вариант, если это становится частой проблемой, похоже, создание нового командлета для приведенного выше фрагмента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...