Переименовать файл с номером версии в файл без номера версии - PullRequest
2 голосов
/ 26 июня 2019

Я хочу переименовать файл-name-1.2.3.war в file-name.war

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

- name: "List *.war if exists on {{ lookup('env','WORKSPACE') }}"
  local_action: 
    module: find
    paths: "{{ lookup('env','WORKSPACE') }}"
    patterns:
      - "[a-z\\-]*[\\[0-9\\.\\-]*.war" 
  register: files_matched
- name: "DEBUG: List *.war if exists on {{ lookup('env','WORKSPACE') }}"  
  debug:
    msg: 
      - "{{ files_matched.files | map(attribute='path') | list }}"

Ожидаемый результат должен переименовать [az \ -] [\ [0-9 \. \ -] от .war к [az \ -] [. \ -] .war

Ответы [ 3 ]

1 голос
/ 26 июня 2019

Если вы не хотите иметь - в конце имени файла, используйте это:

([a-z-]*[a-z])([0-9.-]*)(\..*)

И заменить его на:

\1\3

Проверьте это здесь


(это улучшенная версия ответа, предоставленного @Emma)

0 голосов
/ 26 июня 2019

Если ваше имя файла не может содержать последовательные дефисы, а не в начале или в конце, вы можете использовать группу захвата для того, что вы хотите сохранить соответствие [a-z]+, за которым следует повторяющийся шаблон, чтобы убедиться, что дефис не находится вконец.

Затем сопоставьте то, что вы хотите удалить, снова сопоставив цифры - и 1+, а затем повторяющийся шаблон, чтобы сопоставить точку и цифру, чтобы не было последовательных точек, а не вначало и конец.

В конце используйте положительный прогноз, чтобы утверждать, что справа: .war

Если само ваше имя файла может также содержать символы слов, такие как цифры и подчеркиваниеВы также можете использовать \w+.

. В качестве замены используйте то, что вы хотите сохранить, что входит в первую группу захвата \1

(\w+(?:-\w+)*)-\d+(?:\.\d+)*(?=\.war\b)

Пояснение

  • ( Группа захвата 1
    • \w+(?:-\w+)* Совпадение 1+ слов с последующими 0+ раз - и 1+ слов
  • ) Закрыть nдля группы захвата
  • -\d+ Совпадение - и цифры 1+
  • (?:\.\d+)* Повторить 0+ раз, сопоставляя цифры . и 1+
  • (?=\.war\b) Позитивный взгляд, утверждайте, что прямо справа - .war, за которым следует граница слова, чтобы предотвратить войну как часть более крупного слова

Regex demo

0 голосов
/ 26 июня 2019

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

([a-z-]*)([0-9.-]*)(\..*)

и сделать замену на $1$3.

Пожалуйстасм. демо для дополнительного объяснения.

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

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