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 dos2unix
primero, a menos que esté dispuesto a agregar sed
expresiones para manejar \r
.
Respuesta2
Puedes refinar la sed
expresión para eliminar \r
en 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 g
bandera 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