El reemplazo de Sed en CRLF no funciona

El reemplazo de Sed en CRLF no funciona

Aporte:

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

Salida deseada:

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

Dominio:

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

Esto funciona bien y obtengo el resultado deseado donde el terminador de línea es LF. Tan pronto como edito el archivo en Windows y lo guardo, el terminador de línea LF se reemplaza por CRLF. Y la última expresión sed donde reemplazo el final de la línea $falla "y obtiene un resultado inesperado. Resultado inesperado:

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

Mira los que faltan "al final.

Cualquier experto en sed que pueda venir a rescatarme, por favor :).

Respuesta1

La cita en realidad está ahí, pero reemplazó la cita inicial al imprimir en la pantalla:

$ 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/carriage return, mueve la posición del cursor virtual utilizado para generar texto al inicio de la línea, por lo que final "termina sobrescribiendo (solo en la terminal) la primera comilla.

Es posible que desee enviar la entrada dos2unixprimero, a menos que esté dispuesto a agregar sedexpresiones para manejar \r.

Respuesta2

Puedes refinar la sedexpresión para eliminar \ren caso de que esté allí:

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

Como el principio y el final de la línea existen solo una vez en una línea, la gbandera se puede quitar. No es necesario escapar de las comillas dobles en el "reemplazo". Utilice "alternancia" para simplificar aún más:

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

información relacionada