Вот мое решение с использованием awk
:
$ awk '{$1=$1}1' FS=\' OFS="\\\'" ORS='\\n' <<< "I'm happy.
You're sad."
Это приводит к выводу
I\'m happy.\nYou\'re sad.\n
Пояснение:
Я установил Разделитель Поля (FS
) на '
(экранируя его для shell
как \'
) и Выход Разделитель Поля (OFS
) на \'
(завернутый в "..."
для выхода из '
для shell
и выхода из \
дважды, один раз для shell
и второй раз для awk
, как "\\\'"
). Без дополнительных опций разделитель записей (RS
) является символом новой строки, но я установил Output Разделитель записей (ORS
) на \n
(снова экранируя \
для awk
как \\n
).
Теперь единственное, что нужно сказать awk
, - это пересчитать каждую запись (установив $1
в $1
, ничего не меняется, но awk
считает, что запись изменилась, фактически подставив FS
по OFS
и, таким образом, через каждые '
по \'
) и распечатайте каждую запись (это то, что делает шаблон 1
: 1
верно для всех записей, и поскольку никаких действий не было дано, стандартное действие {print $0}
выполняется), эффективно заменяя RS
на ORS
и, таким образом, каждый перевод строки \n
.