Если модуль.service будет выполняться из модуля.timer, он не может иметь RemainAfterExit=true
. В документации systemd упоминается, что:
Note that in case the unit to activate is already active at the time the timer elapses it is not restarted, but simply left running. There is no concept of spawning new service instances in this case. Due to this, services with RemainAfterExit= set (which stay around continuously even after the service's main process exited) are usually not suitable for activation via repetitive timers, as they will only be activated once, and then stay around forever.
Итак, удалите RemainAfterExit=true
и все заработает.
awk -F[][] -vOFS= '++i==1 {a=$2} i==2 {b=$2} i==3 {$2="[" b "]"} i==4 {$2="[" a "]"} !NF {i=0} 1' input.txt
С квадратными скобками в качестве разделителей полей ваши источники/цели замены находятся в $2
.
Мы увеличиваем i
в каждой строке и сбрасываем его на ноль между абзацами. Значениеi
(от 1 до 4 )говорит нам, что делать с $2
.
$ cat tst.awk
match($0,/\[.*]/) {
idx = (NR - 1) % 5 + 1
sect[idx] = substr($0,RSTART,RLENGTH)
if ( idx == 3 ) {
$0 = $1 OFS sect[2] OFS $NF
}
else if ( idx == 4 ) {
$0 = $1 OFS sect[1] OFS $NF
}
}
{ print }
$ awk -f tst.awk file
A1 [A3 A4 A5] A2
B1 [B3 B4 B5] B2
C1 [B3 B4 B5] C2
D1 [A3 A4 A5] D2
E1 [E3 E4 E5] E2
F1 [F3 F4 F5] F2
G1 [F3 F4 F5] G2
H1 [E3 E4 E5] H2
В приведенном выше примере выполняется замена строк, поэтому он будет работать, даже если разделы внутри квадратных скобок содержат метасимволы регулярных выражений или обратные ссылки.
perl -00pe 's/(.*)(\[.*\])(.*\n)
(.*)(\[.*\])(.*\n)
(.*)(\[.*\])(.*\n)
(.*)(\[.*\])(.*\n)
/$1$2$3$4$5$6$7$5$9$10$2$12/x' input1
perl -00pe
--для каждого абзаца.
Каждая строка RE соответствует строке входного абзаца и разделяет ее на соответствующие части. В группе замены мы просто нужно переставить запчасти.
Извините за путаницу...
А также с GNU awk
для третьего аргумента в match()
и с использованием второго массива, проиндексированного с помощью NR
и настроек по умолчанию для RS
иFS
:
Обновлено:
awk '
{
match($0, /([^\[]*)(\[.*\])([^\]]*)/,a)
b[NR]=a[2]
if (NR==3){print a[1], b[NR-1],a[3];next}
if (NR==4){print a[1], b[NR-3],a[3];next}
else {print a[1], a[2], a[3]}
if ($0 == "") {NR=0}
}' file
A1 [A3 A4 A5] A2
B1 [B3 B4 B5] B2
C1 [B3 B4 B5] C2
D1 [A3 A4 A5] D2
E1 [E3 E4 E5] E2
F1 [F3 F4 F5] F2
G1 [F3 F4 F5] G2
H1 [E3 E4 E5] H2
С GNUsed
:
sed -n -E '
1~5 { p; s/.*(\[.*\]).*/\1/;h };
2~5 { p; s/.*(\[.*\]).*/\1/;
N; s/\n//; s/^(\[.*?\])([^[]*)\[.*\]/\2\1/;p;x;
N; s/\n//; s/^(\[.*?\])([^[]*)\[.*\]/\2\1/;p;
}; 5~5p' infile
TL;DR
1~5 {... }
:это относится к каждой 5 й строке, начиная с первой строки; и то же 2~5 {... }
:применяется к каждой 5-й -й строке, но начинается со второй строки; и 5~5 p
:применяется к каждой 5-й -й -й строке, начиная с пятой строки;
разбивка каждой команды:
1~5 { p; s/.*(\[.*\]).*/\1/;h }
:
команда p
:печатает всю строку, соответствующую условию 1~5
, поэтому для первого абзаца первая строка читается и будет выводиться без изменений; вывод сейчас:
A1 [A3 A4 A5] A2
с s/.*(\[.*\]).*/\1/
, мы захватываем [... ]
часть только из этой строки и удаляем все остальное из вывода; тогда
командой h
копируем этот результат в h старое -пространство; так что теперь держите -пространство содержит это [A3 A4 A5]
.
2~5 { p; s/.*(\[.*\]).*/\1/;
:
команда p
:почти такая же, как и выше, но это для каждой 5 й строки, начиная со второй строки, как сказано; поэтому он напечатает вторую строку; теперь вывод:
A1 [A3 A4 A5] A2
B1 [B3 B4 B5] B2
с s/.*(\[.*\]).*/\1/
, снова захватываем часть [... ]
со второй строки, а все остальное убираем и ничего не делаем; теперь наш шаблон -пробел содержит это[B3 B4 B5]
(и напоминание о том, что пробел -все еще не изменен, и это[A3 A4 A5]
)
вN; s/\n//; s/^(\[.*?\])([^[]*)\[.*\]/\2\1/; p; x;
N
, прочитать следующую строку (3 rd строку сейчас )и добавить ее в пробел шаблона -со встроенной новой строкой между ними; так что теперь наш шаблон -пробел изменился следующим образом:
[B3 B4 B5]
C1 [C3 C4] C2
с помощью s/\n//;
мы сначала удаляем эту встроенную новую строку; теперь у нас есть внизу в шаблоне -пробел
[B3 B4 B5]C1 [C3 C4] C2
вs/^(\[.*?\])([^[]*)\[.*\]/\2\1/; p; x;
:
с ^(\[.*?\])
, мы захватываем [B3 B4 B5]
часть с обратной -ссылкой \1
, которая является началом строки
с ([^[]*)
,захватывает C1
часть с обратной -ссылкой на\2
с \[.*\]
, захватит [C3 C4]
часть, но удалит из строки
в сменной части \2\1
сохранится только, так что теперь шаблон -место:
C1 [B3 B4 B5] C2
следующая команда p
, OK, напечатайте ее; теперь вывод:
A1 [A3 A4 A5] A2
B1 [B3 B4 B5] B2
C1 [B3 B4 B5] C2
теперь шаблон -пробел C1 [B3 B4 B5] C2
и удерживайте -пробел по-прежнему [A3 A4 A5]
; и
следующей командой x
, мы меняем шаблон -пробел на удержание -пробел; теперь шаблон -пробел [A3 A4 A5]
; и удерживайте -пробел, он нам не нужен и пока оставьте его.
вN; s/\n//; s/^(\[.*?\])([^[]*)\[.*\]/\2\1/; p;
:
N
, прочитайте следующую строку (4 й строку сейчас )и добавьте ее в пространство шаблона -со встроенным символом новой строки между ними; так что теперь наш шаблон -пробел изменился следующим образом:
[A3 A4 A5]
D1 [D3 D4] D2
в s/\n//;
мы сначала удаляем эту встроенную новую строку; теперь у нас есть внизу в шаблоне -пробел
[A3 A4 A5]D1 [D3 D4] D2
сs/^(\[.*?\])([^[]*)\[.*\]/\2\1/; p;
:
с ^(\[.*?\])
, мы захватываем [A3 A4 A5]
часть с обратной -ссылкой \1
, которая является началом строки
с ([^[]*)
, фиксирует D1
деталь с тыльной стороной -ссылка на\2
с \[.*\]
, захватит [D3 D4]
часть, но удалит из строки
в сменной детали \2\1
сохранится только, поэтому теперь шаблон -занимает место:
D1 [A3 A4 A5] D2
следующая команда p
, OK, напечатайте ее; теперь вывод:
A1 [A3 A4 A5] A2
B1 [B3 B4 B5] B2
C1 [B3 B4 B5] C2
D1 [A3 A4 A5] D2
с 5~5p
мы печатаем каждую 5-ю -ю строку, начинающуюся со строки 5, то есть пустую строку между каждым абзацем. теперь обрабатывается первый абзац, и те же шаги будут продолжаться с помощью sed
, пока все строки не будут прочитаны и не будут продолжены.