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

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

/\w+[(/\w+)]+

Насколько я понимаю, вышеупомянутое выражение будет искать начало / каталога, затем искать неопределенное количество символов, прежде чем искать повторяющийся блок той же вещи.

Любое руководство будет с благодарностью.

1 ответ1

1

Если я вас правильно понимаю, вам нужно регулярное выражение, которое позволит вам использовать 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 предложение предпочтительнее.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .