Как добавить верхний и нижний колонтитулы в поток sed или awk?

13

У меня есть куча выходных, проходящих через sed и awk.

Как можно префикс вывода с START и суффикс ответа с END?

Например, если у меня есть

All this code
on all these lines
and all these

Как я мог получить:

START
All this code
on all these lines
and all these
END

?

Моя попытка была:

awk '{print "START";print;print "END"}'

но я получил

...
START
    All this code
END
START
    on all these lines
END
START
    and all these
END
Майкл Даррант
источник

Ответы:

11

Это можно сделать sedс помощью

sed -e $'1i\\\nSTART' -e $'$a\\\nEND'

1iозначает, что я вставляю перед строкой 1; $aозначает , что в ppend после последней строки. $'…'Синтаксис Баш-специфичны. В других оболочках вы можете сделать это с помощью:

sed -e '1i \ Enter
START' -e '$ a \ Enter
END'Enter
Скотт
источник
8

Если вы уже используете sed, вы можете использовать, 1чтобы соответствовать первой строке и $последней строке (см . Ответ Скотта ). Если вы уже используете awk, вы можете использовать BEGINблок для запуска кода перед первой строкой и ENDблок для запуска кода после последней строки (см . Ответ Майкла Дарранта ).

Если все, что вам нужно сделать, это добавить верхний и нижний колонтитулы, просто используйте echoи cat.

echo START
cat
echo END

В конвейере, чтобы запустить несколько команд, используйте, { … }чтобы сообщить парсеру, что это одна составная команда.

content-generator |
{ echo START; cat; echo END; } |
postprocessor
Жиль "ТАК - прекрати быть злым"
источник