LINUX.ORG.RU

ansible replace - python regexp

 


1

1

Господа! Кто понимает, и сможет уразуметь меня... Не всасываю совсем.

Есть модуль replace, который использует re в качестве движка. В документации приводится пример:

replace: dest=/etc/hosts regexp='(\s+)oldhostname(\s+.*)?$' replace='\1newhostname\2'

Но мне надо поменять вот такое:

root@dummy:~# cat /etc/hosts
127.0.0.1	localhost
127.0.1.1	oldhostname.company.ru	oldhostname
192.168.1.1     oldhostname.company.ru	oldhostname

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

root@dummy:~# cat /etc/hosts
127.0.0.1	localhost
127.0.1.1	newhostname.company.ru	newhostname
192.168.1.1     newhostname.company.ru	newhostname


# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

КОРОЧЕ: заменить все вхождения (жадный поиск?), слова: oldhostname на слово: newhostname

Как? У меня сложилось ОЧЕНЬ стойкое впечатление, что движок re, не позволяет использовать выражение для всех вхождений, а останавливается на первом совпадении...

Подскажите пожалуйста, господа питонисты!

★★★★★
Ответ на: комментарий от Virtuos86

Спасибо огромное, за помощь, за идею. К сожалению не получилось. Попробую оттолкнувшись от этого поиграться...

DALDON ★★★★★
() автор топика
Ответ на: комментарий от DALDON

Спасибище тебе огромное Virtuos86... Я сам бы опух, пока дошёл до такой простоты!

DALDON ★★★★★
() автор топика
Ответ на: комментарий от DALDON

Ммм, я привел pure python code, _не работать_ он не может в принципе. Куда ты его пытался пихать? Для простой замены тянуть даже не re, а еще более сложный модуль избыточно.

Ну, хотя бы задачу ты решил :}

Virtuos86 ★★★★★
()
Ответ на: комментарий от Virtuos86

Я делаю всё согласно документации ansible, там значится так: если Вы хотите заменить xxx на yyy, в файле на группе серверов: z, используйте модуль replace. Чего я только не пробовал делать, я в этом не особо понимаю. Пробовал, различные условия: И ИЛИ - ничего не помогало. Нашёл онлайн редактор выражений - тоже не помогло ничего... Уже отчаялся, и решил, что re, не умеет искать жадным образом... Но оказывается я слава Богу был не прав.

DALDON ★★★★★
() автор топика
Ответ на: комментарий от DALDON

Перечитал ОП, теперь понятно. Но ты сам виноват, регулярка в ОП ловит только одно вхождение. Если будешь продолжать, имей в виду, что на ЛОР не набегаешься, освой хотя бы на минимальном уровне регэкспы. Советую найти на docs.python.org доку по модулю re, там краткая таблица есть по выражениям, тебе ее хватит.

Virtuos86 ★★★★★
()
Ответ на: комментарий от Virtuos86

Я читал доки, смотрел примеры... Просто я во истину не понял что оно может лениво искать до первого вхождения. А что значит ОП? :)

Смотрел примеры использования модуля re - я ничего не понял. Правда... В целом то я конечно понял, идею регулярных выражений. Но вообще не понял почему одно вхождение только. Там в примерах они компилируют ro. - Зачем, что там возвращается... Как работает этот конечный автомат по поиску вхождения - не понял... Читал статью на хабре также, не понял до конца сути. :(

Так что буду рад пояснениям.

Спасибо!

DALDON ★★★★★
() автор топика
Ответ на: комментарий от DALDON

ОП - опорный пост (треда) ; ТС - топикстартер, тот кто создал ОП треда (в данном случае это ты); тред - обсуждение, тема.

Движок регулярных выражений ищет не до первого вхождения, а столько, сколько указано в регулярном выражении. Пояснения не заменят опыта, к сожалению. Если регэксп не находит, что нужно, то проблема в тебе, а не в неправильных модулях. Практикуйся, если прогресса не будет, значит не твое, анонимус тебе посоветует пойти в дворники.

Virtuos86 ★★★★★
()
Ответ на: комментарий от Virtuos86

Спасибо. По-делу помог, и по отцовски наставил. :) Спасибо всяческое ещё раз.

DALDON ★★★★★
() автор топика
Ответ на: комментарий от DonkeyHot

Понимаю, но как задать точное совпадение слова, в моём случае я не знаю пока ещё... Вообще не представляю. Чтобы искало только цельное совпадение, но при этом искало жадно. Но чтобы не обращало внимание на пробелы, и точки - вначале или в конце... :(

DALDON ★★★★★
() автор топика
Ответ на: комментарий от DALDON

Понимаю, но как задать точное совпадение слова, в моём случае я не знаю пока ещё... Вообще не представляю. Чтобы искало только цельное совпадение, но при этом искало жадно. Но чтобы не обращало внимание на пробелы, и точки - вначале или в конце... :(

может границы слов использовать? типа:

text.replace(/\boldhostname\b/g, "newhostname"))
не знаю, как это записать на вашем обезьяньем ЯП. Но если в именах хостов используется кириллица, а реализация регекспов не поддерживает юникод, работать не будет.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.