dがあるのは段落の区切りまで何も出力させないため

ファイル末尾も段落の区切りだから$!が要る
ファイル末尾に必ず空行があるなら$!は要らない

dでそのサイクルが終了することは知ってますね?