LINUX.ORG.RU

Регэксп для замены секции *.ini

 ,


0

3

Добрый вечер, ЛОР!
Есть следущий *ini-файл:

[sectionA]
key=value

[sectionB]
key=value

[sectionC]
key=value

Нужно безопасно, из shell-скрипта (накостылить скрипт на питуне, который считывает файл в память и там разбирается с секциями — не вариант) заменить все данные в нужной секции.

Что-то похожее на работающий вариант:

perl -i -pe "s/\[sectionA\].*\[/\[sectionA\]\nOUR_CUSTOM_DATA\n\[/s"  

Однако, если мы таким образом попытаемся изменить данные в секции A — секция B исчезнет вникуда (логично, потому что перл будет искать до последнего [, котоырый у нас в секции С, и только потом уже реплейсить — оно и понятно, что B затрётся к чертям)

Выручай, ЛОР!

★★★★★

А чому пистон не вариант?

Zhbert ★★★★★ ()

работающий вариант
perl

Config::IniFiles

на питуне не вариант

на перле вариант, а на пиутоне нет. тебе только пол мегабайта eeprom доступно штоле?

system-root ★★★★★ ()

А не проще ограничить жадность квантификатора? Чтоб искал не самую длинную последовательность, а первую?

Kronick ()
Ответ на: комментарий от annerleen

Смутно помню знаком вопроса, в начале выражения вроде бы. Я щас поковыряю сам конечно и отвечу, а вообще «reduce greedy match perl», гуглить что-то вроде этого

Kronick ()

Парсер инишников используй а не натягивай сову на глобус.

anonymous ()
Ответ на: комментарий от pawnhearts

почти уговорил (на самом деле нет)

~ time python -c "import ConfigParser;c=ConfigParser.ConfigParser();c.read('peers');c.set('33001', 'foo', 'bar11');c.write(open('peers', 'w'));"

real	0m0.014s
~ time perl -i -0777 -pe "s/\[33001\].*?\[/\[33001\]\nPEERDATA\n\[/s"  peers
real	0m0.004s

p.s. да, это очень важно
p.s.s.: помогло добавить ? перед \[ в регэкспе.

annerleen ★★★★★ ()

допустим ты знаешь что тебе надо редактировать секцию [sectionA]
ты знаешь что после неё идет именно [sectionB] ?

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

милисекунды важно? или инструмент (перл и баш годится, питон не годится?)

bl ★★★ ()

Если проблема только в жадности - то уберите её

perl -i -pe "s/\[sectionA\].*?\[/\[sectionA\]\nOUR_CUSTOM_DATA\n\[/s"  
Deleted ()

awk -v RS= -v ORS='\n\n' -v OFS='\n' '$1 == "[sectionA]" {$2 = "smth"} 1'

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