Aquí está mi solución con awk
:
$ awk '{$1=$1}1' FS=\' OFS="\\\'" ORS='\\n' <<< "I'm happy.
You're sad."
Esto da lugar a la salida
I\'m happy.\nYou\'re sad.\n
Explicación:
puse el separador de campo (FS
) para '
(escapar de ella para la shell
como \'
) y la salida Separador de campo (OFS
) para \'
(envuelto en "..."
para escapar de la '
para la shell
y escapar de la \
dos veces , una vez para shell
y una segunda vez para awk
, como "\\\'"
). Sin más opciones, el separador de registro (RS
) es el carácter de nueva línea, pero establece la salida separador de registros (ORS
) a \n
(otra vez escapar de la \
para awk
como \\n
).
Ahora lo único que queda para contar awk
que hacer es volver a calcular cada registro (mediante el establecimiento de $1
a $1
, nada cambia, pero awk
piensa que el registro modificado, sustituyendo efectivamente FS
por OFS
und así cada '
por \'
) e imprima cada registro (esto es lo que hace el patrón 1
: 1
es verdadero para todos los registros y dado que no se realizó ninguna acción, se ejecuta la acción estándar {print $0}
), sustituyendo efectivamente RS
por ORS
y por lo tanto cada nueva línea por \n
.
Usted no tiene que ejecutar 2 comandos sed, puede ejecutar múltiples sustituciones dentro de comando sed. Creo que cada uno termina con un ";" carácter, aunque si eso no funciona, simplemente coloque las 2 líneas en un archivo y use "sed -f" –
slacy
@slacy: sed-e 's/foo/bar/g' -e 's/baz/qux/g ' –
no lo sabía. ¡Gracias! – Chaitan