Shell one-liner pour append une ligne au milieu d'un tuyau

J'écris un script qui envoie le file d'input à CPP, puis à grep, puis à un certain programme:

cpp $1 | grep -v "#" | theprogram 

Mais, "theprogram" nécessite que l'input commence par une certaine ligne constante "theprogram-1.0". Donc, je veux append cette ligne constante à la sortie de grep, juste avant de l'envoyer à "theprogram".

Bien sûr, je peux faire tout cela en utilisant un file temporaire … mais je suis sûr qu'il y a moyen de faire une tâche aussi simple dans une seule ligne de shell pipes, sans files temporaires. Quel est le tour?

Vous pouvez entourer une séquence de commands avec des parenthèses. Chaque command à l'intérieur des parenthèses aura access aux mêmes stdin, stdout et stderr. Ici, echo enverra à stdout mais ne modifiera pas le stdin que grep voit.

 cpp $1 | (echo 'your constant line here'; grep -v "#") | theprogram 

Comme décrit dans le langage de command Shell: les commands de regroupement , on peut utiliser des accolades au lieu de parenthèses pour le regroupement. L'utilisation des accolades est légèrement plus efficace, car un sous-shell ne sera pas créé, mais il présente une syntaxe plus compliquée: il doit y avoir un séparateur de champs après le { , et un délimiteur tel que ; ou newline avant le } . Mais plusieurs personnes l'ont suggéré comme alternative, alors voici:

 cpp $1 | { echo 'your constant line here'; grep -v "#"; } | theprogram