Mit der Option -n aufgerufen gibt sed nur dann eine Zeile aus, wenn er mit dem Befehl p explizit dazu angewiesen wird. So erhalten wir die Zeilen von b, die mit einem Rautezeichen beginnen:
sed -n '/^#/p' b
Wir wollen aber gleichzeitig das Rautezeichen durch einen Zircumflex ersetzen.
sed -n 's/^#/^/p' b > regex.txt
Die so erzeugte Datei enthält nun eine Liste von regulären Ausdrücken
^cc
^dd
Nun soll grep alle Zeilen von a ausgeben, die nicht mit cc oder dd beginnen, das könnte man so schreiben:
grep -v -e ^cc -e ^dd a
oder wir verwenden einfach die von sed erzeugte Liste
grep -v -f regex.txt a
Und nun das ganze ohne Umweg über eine Datei. Damit grep die Liste regulärer Ausdrücke aus einer Pipe liest (diese also nicht als Quelle der zu filternden Daten interpretiert), muss als Eingabedatei stdin angegeben werden.
sed -n 's/^#/^/p' b | grep -v -f /dev/stdin a
Anstelle von /dev/stdin kann man bei einigen Programme (z.B. sox) auch das Minuszeichen angeben, bei grep ist es undokumentiert, ich hatte es einfach ausprobiert.
Problem bei dieser Lösung könnte noch sein, dass nur die ersten Zeichen jeder Zeile überprüft werden, unsere regulären Ausdrücke sollten wohl besser so aussehen
^cc$
^dd$
Das ließe sich so bewerkstelligen:
sed -n '/^#/{s/#/^/;s/$/$/p}' b > regex.txt
So kommt man übrigens auch ans Ziel
grep -v -E '^(cc|dd)$' a
oder so
sed -r '/^(cc|dd)$/d' a
Problem dabei ist die relevanten Zeilen aus b durch einen senkrecheten Strich getrennt in eine Zeile zu bekommen, dashalb war meine zweite Lösung etwas komplizierter