Удалить строки между двумя шаблонами, исключая другие строки, содержащие эти шаблоны - PullRequest
0 голосов
/ 28 февраля 2020

Я хотел бы удалить только строки между PATTERN1 (aaa) и PATTERN2 (ccc), исключая другие строки, где шаблоны совпадают.

Я пытаюсь удалить пустую строку между PATTERN1 (aaa ) и PATTERN2 (ccc), строка 8 в моем примере ... Эта строка не будет все время находиться в одном и том же месте, поэтому я пытаюсь удалить ее, используя 2 шаблона.

По сути, это сводится к следующему: «Если между aaa и ccc найдена пустая строка, удалите ее ...

входной файл

aaa 409
bbb 201

122 0.98
aaa 1.47
aaa 0.00
aaa 0.00

ccc 0.00
121 0.01
135 1.99

выходной файл

aaa 409
bbb 201

122 0.98
aaa 1.47
aaa 0.00
aaa 0.00
ccc 0.00
121 0.01
135 1.99

попытки

sed  '/aaa/,/ccc/{//p;d;}' file
sed '/aaa/,/ccc/{//!d}' file
awk '/aaa/{g=1;next}/ccc/{g=0;next}g' file

Заранее спасибо.

1 Ответ

2 голосов
/ 28 февраля 2020
$ cat tst.awk
/aaa/ { printf "%s", block; block=""; inBlock=1 }
!inBlock { print }
inBlock {
    block = block $0 ORS
    if ( /ccc/ ) {
        gsub(/\n+/,"\n",block)
        printf "%s", block
        block = ""
        inBlock = 0
    }
}
END { printf "%s", block }

.

$ awk -f tst.awk file
aaa 409
bbb 201

122 0.98
aaa 1.47
aaa 0.00
aaa 0.00
ccc 0.00
121 0.01
135 1.99

Приведенное выше удаляет все пустые строки в блоке строк между ccc и ближайшим aaa перед ним. Чтобы изолировать этот блок, он запускает блок, когда видит aaa, а затем перезапускает его (после печати того, что было сохранено как есть), если / когда встречается следующий aaa до ccc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...