Почему sed во всем мире заменяет только первое появление в нескольких случаях?

Я хочу, чтобы глобально заменить все \n символы новой строки на их \n escape-последовательность и все ' одиночные кавычки с двумя '' из них следующим образом:

 function esc_foobar { # Escapes any "'" single quotation character. local -r esc_quot="s:':'':g" # Escapes any "\n" new line character. local -r esc_nl=':a;N;$!ba;s:\n:\\n:g' # Escape everything in one sed run. sed -- "$esc_quot;$esc_nl" foobar.txt } 

Учитывая, что файл foobar.txt содержит:

 Foo's bar Bar's foo 

Только первый символ одиночной кавычки удваивается.

Реверсирование порядка esc_quot и esc_nl замен в команде sed на $esc_nl;$esc_quot работает, т.е. все символы одиночной кавычки удваиваются, как ожидалось.

Почему это так?

После того, как я занялся Седом и, особенно пытаясь окунуться в команду Sed's N я придумал следующий небольшой скрипт Sed, который работает для меня:

 sed -- '$!N;s:\n:\\n:g;'"s:':'':g" 

Второй вариант скрипта Sed из моего вопроса имеет проблему, заключающуюся в том, что он оставляет последнюю строку нетронутой, если число строк ввода нечетно.