История изменений
Исправление Xintrea, (текущая версия) :
В общем, да, проблема была в том, что «\s» матчит все пробельные символы, включая перевод строки.
Вместо этого простого символа надо писать так:
\s(?<!\n) - любой пробельный символ, кроме перевода строки
Взято отсюда: https://stackoverflow.com/questions/35838690/escaping-n-in-s-match-in-reg-ex-...
И тогда все начинает работать правильно.
Полный код выглядит так:
- name: "Добавление секции non-free в APT"
replace:
dest: /etc/apt/sources.list
regexp: '^(deb|deb-src)\s+(https?:\/\/[^\s]*debian[^\s]*)\s+(.+?)\s+main\s+contrib(\s(?<!\n))*(?!non-free)(\s(?<!\n))*$'
replace: '\1 \2 \3 main contrib non-free'
Ограничения этого кода в том, что он находит только строки с main+contrib, и заменяет их на main+contrib+non-free. Причем не дает повторять non-free, если запустить заново.
Как сделать так, чтобы просто проверялось наличие non-free в списке секций (независимо от того, какие секции уже прописаны) и добавлялось non-free если таковой секции нет, я не придумал. Можно было бы написать собственный фильтр, но это уже за гранью, я устал.
Исходная версия Xintrea, :
В общем, да, проблема была в том, что «\s» матчит все пробельные символы, включая перевод строки.
Вместо этого простого символа надо писать так:
\s(?<!\n) - любой пробельный символ, кроме перевода строки
Взято отсюда: https://stackoverflow.com/questions/35838690/escaping-n-in-s-match-in-reg-ex-...
И тогда все начинает работать правильно.
Полный код выглядит так:
- name: "Добавление секции non-free в APT"
replace:
dest: /etc/apt/sources.list
regexp: '^(deb|deb-src)\s+(http:\/\/[^\s]*debian[^\s]*)\s+(.+?)\s+main\s+contrib(\s(?<!\n))*(?!non-free)(\s(?<!\n))*$'
replace: '\1 \2 \3 main contrib non-free'
Ограничения этого кода в том, что он находит только строки с main+contrib, и заменяет их на main+contrib+non-free. Причем не дает повторять non-free, если запустить заново.
Как сделать так, чтобы просто проверялось наличие non-free в списке секций (независимо от того, какие секции уже прописаны) и добавлялось non-free если таковой секции нет, я не придумал. Можно было бы написать собственный фильтр, но это уже за гранью, я устал.