С sed
:
sed '$!N;/remove/!P;D' infile
Это вытягивает N
строку ext в пространство образца (если не !
в последней $
строке) и проверяет, совпадает ли пространство образца remove
. Если это не так (означает, что ни одна из двух строк в шаблонном пространстве не содержит строку remove
), он P
печатается до первого \n
символа линии смещения (т.е. печатает первую строку). Затем он D
поднимается до первого \n
символа Ewline и перезапускает цикл. Таким образом, в шаблонном пространстве не может быть более двух строк.
Это , вероятно , легче понять N
, P
, D
цикл , если добавить l
до и после того , как N
смотреть на картины пространства:
sed 'l;$!N;l;/remove/!P;D' infile
Итак, используя только последние шесть строк из вашего примера:
8AC3
remove
8AE4
8AE5
8AE6
remove
последняя команда выводит:
8AC3 $
8AC3 \ n удалить $
удалить $
удалить \ n 8AE4 $
8AE4 $
8AE4 \ n 8AE5 $
8AE4
8AE5 $
8AE5 \ n 8AE6 $
8AE5
8AE6 $
8AE6 \ n удалить $
удалить $
удалить $
Вот краткое объяснение:
CMD выходной CMD
l 8AC3$ N # read in the next line
l 8AC3\n remove$ D # delete up to \n (pattern space matches so no P)
l remove$ N # read in the next line
l remove\n 8AE4$ D # delete up to \n (pattern space matches so no P)
l 8AE4$ N # read in the next line
l 8AE4\n 8AE5$ # pattern space doesn't match so print up to \n
P 8AE4 D # delete up to \n
l 8AE5$ N # read in the next line
l 8AE5\n 8AE6$ # pattern space doesn't match so print up to \n
P 8AE5 D # delete up to \n
l 8AE6$ N # read in the next line
l 8AE6\n remove$ D # delete up to \n (pattern space matches so no P)
l remove$ # last line so no N
l remove$ D # delete (pattern space matches so no P)