Isso é uma citação complexa. O argumento para sed é construído a partir de duas partes. Primeiro, há 's/$' , um literal de cadeia com aspas simples, produzindo os caracteres s/$ . Em seguida, há uma cadeia entre aspas duplas, que contém a substituição do comando 'echo \\r' . Isso executa o comando echo \r , que, dependendo do shell, imprime \r ou um caractere CR. (O texto impresso por echo termina em uma nova linha, mas a substituição de comando consome isso.) Para que esse comando tenha o efeito desejado, você deve estar em um sistema em que echo \r imprime um caractere CR, que eu vou representar aqui como ␍ .
O argumento para sed é, portanto, s/$/␍/ . Isso substitui todas as correspondências da expressão regular $ pela string ␍ . O regex $ corresponde à string vazia, mas apenas no final de uma linha, portanto, esse comando sed acrescenta um CR a cada linha. Como uma linha Unix termina com LF enquanto uma linha do Windows termina com CR + LF, isso transforma as terminações de linha do Unix em finais de linha do Windows.
O GNU sed, mas não outras versões, compreende escapes de barra invertida, como \r . Então, com o GNU sed você pode escrever sed 's/$/\r/' . No entanto, isso não funciona com outras implementações sed (BSD, Solaris,…). echo \r também não é muito portátil. Uma solução portátil é usar tr , que tem backslash como padrão.
sed "$(echo 's/$/@/' | tr '@' '\r')"