O triste estado de "separadores de registros" ou "terminadores de linha" é um legado da idade das trevas da computação.
Agora, assumimos que tudo o que queremos representar é, de alguma forma, dados estruturados e está em conformidade com várias abstrações que definem linhas, arquivos, protocolos, mensagens, marcações, o que for.
Mas uma vez isso não era exatamente verdade. Caracteres de controle integrados dos aplicativos e processamento específico do dispositivo. Os sistemas de morte encefálica que exigiam CR e LF simplesmente não tinham abstração para separadores de registros ou terminadores de linha. O CR era necessário para que o teletipo ou a exibição de vídeo retornasse à coluna um e o LF (hoje, NL, mesmo código) era necessário para que ele avançasse para a próxima linha. Eu acho que a ideia de fazer algo diferente de descarregar os dados brutos no dispositivo era muito complexa.
Unix e Mac, na verdade, especificaram uma abstração para o final da linha, imagine isso. Infelizmente, eles especificaram diferentes. (Unix, ahem, veio primeiro.) E, naturalmente, eles usaram um código de controle que já estava "próximo" ao SOP
Como quase todo o nosso software operacional hoje é descendente do SW operacional do Unix, Mac ou MS, estamos presos à confusão de final de linha.
\n
normalmente é representado por um avanço de linha, mas não é necessariamente um avanço de linha.