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')"