Набор абзацев из 4 строк для управления с помощью AWK

Если модуль.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и все заработает.

5
18.11.2020, 12:40
5 ответов
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.

4
18.03.2021, 22:49
$ 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

В приведенном выше примере выполняется замена строк, поэтому он будет работать, даже если разделы внутри квадратных скобок содержат метасимволы регулярных выражений или обратные ссылки.

2
18.03.2021, 22:49
perl -00pe 's/(.*)(\[.*\])(.*\n)
              (.*)(\[.*\])(.*\n)
              (.*)(\[.*\])(.*\n)
              (.*)(\[.*\])(.*\n)
             /$1$2$3$4$5$6$7$5$9$10$2$12/x' input1

perl -00pe--для каждого абзаца.

Каждая строка RE соответствует строке входного абзаца и разделяет ее на соответствующие части. В группе замены мы просто нужно переставить запчасти.

Извините за путаницу...

1
18.03.2021, 22:49

А также с 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

0
18.03.2021, 22:49

С 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, пока все строки не будут прочитаны и не будут продолжены.

1
18.03.2021, 22:49

Теги

Похожие вопросы