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 dos2unix
primeiro, a menos que queira adicionar sed
expressões para manipular \r
.
Responder2
Você pode refinar a sed
expressão para eliminar \r
caso 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 g
sinalizador 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