1

Тема: Багатодяркова заміна у файлі. Можливо за допомогою perl.

Мені треба замінити перший / всередині \ukindex на !.

Наприклад, \ukindex{слабка/двоїстість|)}% стає \ukindex{двоїстість!слабка|)}%.

Я можу це зробити в кожному окремому рядку файлу за допомогою

sed -i 's/\(\ukindex{[^/^}]\+\)\//\1!/g' linear-programming.tex

Але ж може бути і так
\ukindex{лінійне
програмування/двоїстість}%

тоді моя sed інструкція не спрацьовує.

Я пробую так із perl

perl -pe 's/\(\ukindex{[^/^}]\+\)\//\1!/igs' linear-programming.tex

але отримую

Unmatched [ in regex; marked by <-- HERE in m/\(Kindex{[ <-- HERE ^/ at -e line 1.

ukrainian.stackexchange.com - це питання-відповіді з української мови
Подякували: 0xDADA11C7, leofun012

2

Re: Багатодяркова заміна у файлі. Можливо за допомогою perl.

Фактично можна зібрати увесь файл в один рядок, замінивши всі '\n' на якійсь рідко вживаний символ як-от '\f', а потім зробити зворотню заміну:

cat any.tex | tr '\n' '\f' | sed -e 's/\(\ukindex{[^/^}]\+\)\//\1!/g' | tr '\f' '\n

тут результат виводиться в консоль.

ukrainian.stackexchange.com - це питання-відповіді з української мови
Подякували: 0xDADA11C71

3 Востаннє редагувалося P.Y. (15.09.2016 16:46:12)

Re: Багатодяркова заміна у файлі. Можливо за допомогою perl.

У sed ще є команда N, яка довантажує наступний рядок у буфер (pattern space), в межах якого здійснюється пошук та заміна. Приблизно уявляю, як можна це зробити циклічно (з використанням міток і переходів), трохи пізніше напишу.

PS виправлено

py -3 -m pip install git+https://github.com/snoack/python-goto
Подякували: 0xDADA11C71

4

Re: Багатодяркова заміна у файлі. Можливо за допомогою perl.

sed -e ":loop /{[^}]*$/{ N ; bloop } ; s/\(\ukindex{[^/^}]\+\)\//\1!/g"
py -3 -m pip install git+https://github.com/snoack/python-goto
Подякували: 0xDADA11C7, leofun01, Yola, ReAl4

5 Востаннє редагувалося ReAl (17.09.2016 14:53:46)

Re: Багатодяркова заміна у файлі. Можливо за допомогою perl.

Почав вчора вдень на роботі щось подібне малювати, але обірвали і не дали.
Тільки я тупішу умову робив — «якщо в цьому рядку нема }, то підтягти наступний».

sed -e ':loop /.*}.*/!{ N ; b loop } ; s/\(\\ukindex{[^/^}]\+\)\//\1!/g'

p.s.А чого у всіх бекслеш один перед ukindex? Він же так що є, що нема. В якомусь  \newukindex{слабка/двоїстість|)}% теж заміну зробить.

printf("Nested comments is %s\n", */*/**/"*/"/*"/**/ == '*' ? "OFF" : "ON");
Подякували: leofun011

6

Re: Багатодяркова заміна у файлі. Можливо за допомогою perl.

У загальному випадкові моя умова з інверсною «адресою» неправильна, бо не спрацює, коли фігурних дужок декілька і не витримано баланс, наприклад { } {
Та і умова P.Y. теж, бо  {{} пропустить.

printf("Nested comments is %s\n", */*/**/"*/"/*"/**/ == '*' ? "OFF" : "ON");
Подякували: Yola1