input.txt:
8B0C
remove
8B0D
remove
8B0E
remove
8B0F
8B10
remove
8B14
remove
8B15
remove
8B16
remove
8B17
remove
8AC0
8AC1
remove
8AC2
remove
8AC3
remove
8AE4
8AE5
8AE6
remove
Желаемый вывод:
8B0F
8AC0
8AE4
8AE5
Я хочу напечатать строку, если эта строка или следующая строка не содержат «удалить». Я использую солярис 5.10, KSH.
text-processing
sed
awk
solaris
ayrton_senna
источник
источник
Ответы:
С
sed
:Это вытягивает
N
строку ext в пространство образца (если не!
в последней$
строке) и проверяет, совпадает ли пространство образцаremove
. Если это не так (означает, что ни одна из двух строк в шаблонном пространстве не содержит строкуremove
), онP
печатается до первого\n
символа линии смещения (т.е. печатает первую строку). Затем онD
поднимается до первого\n
символа Ewline и перезапускает цикл. Таким образом, в шаблонном пространстве не может быть более двух строк.Это , вероятно , легче понять
N
,P
,D
цикл , если добавитьl
до и после того , какN
смотреть на картины пространства:Итак, используя только последние шесть строк из вашего примера:
последняя команда выводит:
Вот краткое объяснение:
источник
источник
Вышеупомянутый метод не читает записи построчно , скорее он читает многострочные записи от одного разделителя записей (RS) к следующему (или концу файла) - самой
RS
строке «удалить» (включая ее завершающий `\ n).!RT
Тест необходим для того, когда последняя строка не являетсяRS
строка.RT
, Простак-изм , фактический текст текущей записи - хRS
.gensub
это также зеваки .Если вам нужно проверить строку маркера, которая соответствует «удалить» в любом месте строки, вместо строки, которая равна «удалить», просто измените разделитель записей на:
Вывод:
источник