O que essa regex significa?

1

Eu estava trabalhando na conversão da nova linha do Unix para a nova linha do Windows. Eu tentei unix2dos mas me deu algum erro binário, então eu olhei para cima e tropeçou nessa regex

sed 's/$'"/'echo \\r'/" input.txt > output.txt

Este regex está funcionando, mas não tenho ideia, como está funcionando? Obviamente estou tentando interpretá-lo através deste formulário

sed 's/a/b/'

aqui

a refers $'" which I don't understand.
and b refers echo \\r which means '\r'

Também não entendo por que / como a combinação de aspas simples e duplas está sendo usada? Alguém pode explicar essa expressão regular para mim?

    
por Dude 15.11.2013 / 20:29

2 respostas

4

Não há $'"

's/$'"/'echo \\r'/" == "s/\$/'echo \\r'/"

Mas o autor regex apenas gostava de escapar de $ por meio de aspas simples.

Você pode combinar esse escape da maneira que quiser.

Então, seu regex apenas acrescenta \r ao final da linha.

atualização. Inicialmente, não ficou claro pela pergunta que ele usa 'eco' em vez de apenas eco. Não há necessidade de usar echo aqui. Você pode fazer isso diretamente no sed:

sed 's/$/\r/'
    
por 15.11.2013 / 20:34
1

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')"
    
por 17.11.2013 / 23:26