Sed substituir no CRLF não funciona

Sed substituir no CRLF não funciona

Entrada:

bharti+bharti-ims+bharti-sdm+RuleForBhartiOnlyIndices+kibana_user

Saída desejada:

"bharti","bharti-ims","bharti-sdm","RuleForBhartiOnlyIndices","kibana_user"

Comando:

echo "bharti+bharti-ims+bharti-sdm+RuleForBhartiOnlyIndices+kibana_user" | sed -e 's/^/"/g' -e 's/+/","/g' -e 's/$/\"/g'

Isso está funcionando bem e estou obtendo a saída desejada onde o terminador de linha é LF. Assim que eu edito o arquivo no Windows e o salvo, o terminador de linha LF é substituído por CRLF. E a última expressão sed onde substituo o final da linha $está "falhando e obtendo resultados inesperados. Resultado inesperado:

"bharti","bharti-ims","bharti-sdm","RuleForBhartiOnlyIndices","kibana_user

Veja a falta "no final.

Qualquer especialista em sed que possa vir em meu socorro, por favor :).

Responder1

A cotação está realmente lá, mas substituiu a cotação inicial ao imprimir na tela:

$ printf '%s\r\n' 'foo' | sed -e 's/^/"/g' -e 's/+/","/g' -e 's/$/\"/g' | od --format c
0000000   "   f   o   o  \r   "  \n
0000007

\r/CR/retorno de carro, move a posição do cursor virtual usado para enviar o texto para o início da linha, de modo que o final "acaba sobrescrevendo (apenas no terminal) a primeira aspa.

Você pode querer enviar a entrada dos2unixprimeiro, a menos que queira adicionar sedexpressões para manipular \r.

Responder2

Você pode refinar a sedexpressão para eliminar \rcaso ela esteja lá:

sed -e 's/^/"/' -e 's/+/","/g' -e 's/\r*$/"/' file

Como o início e o fim da linha existem apenas uma vez em uma linha, o gsinalizador pode ser descartado. Não há necessidade de escapar das aspas duplas na "substituição". Use "alternância" para simplificar ainda mais:

sed -e 's/^\|\r*$/"/g' -e 's/+/","/g' file

informação relacionada