Если я вас правильно понимаю, вам нужно регулярное выражение, которое позволит вам использовать grep
для определения путей. Я не уверен, что вы пытаетесь сделать с регулярным выражением, которое вы опубликовали. Почему вы хотите что-то повторить? Для путей требуется только одна косая черта: /etc
В любом случае, если вам нужен какой-либо путь (пути могут также содержать несловарные символы, такие как {
, [
, (
пробелы и новые строки и т.д.), Попробуйте это:
grep -E '/[^/]+' *txt
_____
| |--------> one or more
|-----------> A character class, '^' in a character class means NOT,
so this class means "anything that is not /".
-E
сообщает grep
что шаблон, который вы ему дадите, должен интерпретироваться как расширенное регулярное выражение, а не как его стандартное базовое регулярное выражение. ERE поддерживают « +
для "одного или нескольких", что необходимо для поиска только строк с хотя бы одним символом без косой черты после первой косой черты.
Если вы хотите найти только пути с более чем одним /
, вы можете сделать что-то вроде
grep -E '/[^/]+/[^/]+' *txt
Пути могут также заканчиваться косой чертой, если по какой-то причине вы хотите сохранить такие конечные косые черты (/?
означает «найти ноль или один /
):
grep -E '/[^/]+/[^/]+/?' *txt
В частности, регулярное выражение, которое вы используете, не работает по разным причинам. Прежде всего, как указал @erewok, вы используете круглые скобки и +
в квадратных скобках. Так как в скобках указан класс символов, все, что в них содержится, рассматривается как один из символов, которые нужно найти (за исключением ^
что делает его классом отрицательных символов).
Таким образом, [(/\w+)]+
означает найти любой из (
, /
, любой символ слова (\w
), +
или )
один или несколько раз. В любом случае \w
не распознается grep
если вы не используете Perl-совместимые регулярные выражения. Вы можете активировать их в grep
с флагом -P
. Например, это будет соответствовать пути как /etc
:
grep -P '/\w+' *txt
Если вы знаете, что ваши пути всегда будут состоять из символов слова (т. Е. Az, AZ, 0-9 и _
), вы можете использовать выражение, подобное приведенному выше, но поскольку нельзя быть уверенным, используя что-то менее строгое, lke my fist предложение предпочтительнее.