Итак, вы пытаетесь сопоставить литерал xx_
? Начните свой шаблон с этой части.
xx_
Далее идут «3 цифры», которые вы пытаетесь сопоставить. Я собираюсь предположить, основываясь на вашем собственном регулярном выражении, что под «цифрами» вы подразумеваете символы (следовательно, классы символов [a-zA-Z]
). Давайте сделаем квантификатор неживым, чтобы избежать непреднамеренного захвата.
xx_[a-zA-Z]{3,}?
Для первой и последней частей я вижу, что вы указали переменную длину не менее двух символов. Давайте сделаем так, чтобы эти кванторы не были жадными, добавив символ ?
после наших квантификаторов. Согласно вашему регулярному выражению, также похоже, что вы ожидаете, что ваша городская конструкция примет аналогичную форму с битами firstname и lastname. Тогда добавим все три.
xx_[a-zA-Z]{3,}?_[a-zA-Z]{2,}?_[a-zA-Z]{2,}?_[a-zA-Z]{2,}\.
ПРИМЕЧАНИЕ: Мы не должны сделать город квантор нежадным, так как мы утверждали, что за ним следует буквальному "."
, что мы не должны появляться нигде в тексте интересующие нас в сопоставлении. Обратите внимание, как это экранировано, потому что это метасимвол в синтаксисе regex.
Идет, наконец, расширение файла, которое имеет ваш пример как "docx"
. Я также вижу, что вы добавили "doc"
и расширение "pdf"
в ваше регулярное выражение. Давайте объединим все три из них.
xx_[a-zA-Z]{3,}?_[a-zA-Z]{2,}?_[a-zA-Z]{2,}?_[a-zA-Z]{2,}\.(docx?|pdf)
Надеюсь, это сработает. Прокомментируйте, если вам нужно какое-либо разъяснение. Обратите внимание, как части "doc"
и "docx"
были сконденсированы в один элемент. Это не обязательно, но я думаю, что в этой форме он выглядит более преднамеренным. Он также может быть записан как (doc|docx|pdf)
. Немного повторяю на мой вкус.
Не используйте 'ls | grep' - см. http://mywiki.wooledge.org/ParsingLs –
Можете ли вы указать, какую оболочку вы используете? Red Hat отправляет несколько - bash? МКШ? –
BTW, '[xx_]' соответствует * одному символу *, либо 'x', либо' _'. –