Ansible regex_findall несколько строк - PullRequest
0 голосов
/ 11 февраля 2019

Маршрутизаторы Cisco IOS, выполняющие «dir», и я хочу получить все имена файлов с «.bin» в имени.

Пример строки: Каталог flash0: /

1  -rw-    95890300  May 24 2015 11:27:22 +00:00  c2900-universalk9-mz.SPA.153-3.M5.bin
2  -rw-    68569216   Feb 8 2019 20:15:26 +00:00  c3900e-universalk9-mz.SPA.151-4.M10.bin
3  -rw-       46880  Oct 25 2017 19:08:56 +00:00  pdcamadeusrtra-cfg
4  -rw-         600   Feb 1 2019 19:36:44 +00:00  vlan.dat

260153344 байт (всего 95637504 байт)

Я понял, как вытащить «bin», но не могу понять, как вытащить все имя файла (начиная с «c» и заканчиваяв «bin»), потому что я хочу затем использовать значения и удалить ненужные файлы.

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

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

Чтобы сопоставить имя файла, начинающееся с c (или в начале строки), вы можете использовать отрицательный внешний вид (?<!\S), чтобы проверить, что слева не непробельный символ.

Затем сопоставьте либо 1+ раз, но не символ пробела \S+, либо укажите в классе символов [\w.-]+, что разрешено сопоставлять разрешенным символам.После этого сопоставьте точку \., за которой следует bin.

. В конце вы можете использовать границу слова \b, чтобы bin не был частью большего слова:

(?<!\S)[\w.-]+\.bin\b

regex101 demo

0 голосов
/ 12 февраля 2019

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

binfiles = "{{dir_response.stdout [0] | regex_findall ('\ b (? = (C. *).bin)) \ b ')}} "

Теперь я получаю это: ЗАДАЧА [set_fact] ******************************************************************************************************** путь к задаче: /export/home/e130885/playbooks/ios-switch-upgrade/ios_clean_flash.yml: 16 вторник, 12 февраля 2019 г. 08:29:58 -0600 (0: 00: 00.350) 0: 00: 03.028 ****** нормально: [10.35.91.200] => изменено = false ansible_facts: binfiles: - c2900-universalk9-mz.SPA.153-3.M5.bin - c3900e-universalk9-mz.SPA.151-4.M10.bin - c2800nm-adventerprisek9-mz.151-4.M12a.bin

Ontoследующая задача выяснить, как использовать каждый элемент.Спасибо!

0 голосов
/ 11 февраля 2019

Вы можете использовать это регулярное выражение

^[\w\W]+?(?=(c.*\.bin))\1$
  • ^ - начало строки.
  • [\w\W]+? - сопоставить что-либо один или несколько раз (режим Lazy).
  • (?=(c.*\.bin)) - совпадение с положительным прогнозом c, за которым следует что-либо, за которым следует \.bin (группа 1)
  • \1 - совпадение группы 1.
  • $ - конецстроки.

Демо

...