Wie füge ich eine Kopf- und / oder Fußzeile zu einem sed- oder awk-Stream hinzu?

13

Ich habe ein paar Ausgaben, die durch sed und awk laufen.

Wie kann ich der Ausgabe START voranstellen und der Antwort END hinzufügen?

Zum Beispiel, wenn ich habe

All this code
on all these lines
and all these

Wie könnte ich bekommen:

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

?

Mein Versuch war:

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

aber ich habe

...
START
    All this code
END
START
    on all these lines
END
START
    and all these
END
Michael Durrant
quelle
9
Mit BEGIN und END ...
jasonwryan

Antworten:

11

Dies kann sedmit durchgeführt werden

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

1iMittel i nsert vor Zeile 1; $abedeutet eine Pause nach der letzten Zeile. Die $'…'Syntax ist bash-spezifisch. In anderen Shells sollte dies möglich sein mit:

sed -e '1i \ Enter
START' -e '$ a \ Enter
END'Enter
Scott
quelle
8

Wenn Sie sed bereits verwenden, können Sie 1mit der ersten und $der letzten Zeile übereinstimmen (siehe Scotts Antwort ). Wenn Sie awk bereits verwenden, können Sie einen BEGINBlock zum Ausführen von Code vor der ersten Zeile und einen ENDBlock zum Ausführen von Code nach der letzten Zeile verwenden (siehe Antwort von Michael Durrant ).

Wenn Sie lediglich eine Kopf- und eine Fußzeile hinzufügen müssen, verwenden Sie einfach echound cat.

echo START
cat
echo END

Wenn Sie in einer Pipeline mehrere Befehle ausführen möchten, { … }teilen Sie dem Parser mit, dass es sich um einen einzigen zusammengesetzten Befehl handelt.

content-generator |
{ echo START; cat; echo END; } |
postprocessor
Gilles 'SO - hör auf böse zu sein'
quelle