Использует ли команда sed команду «a» для префикса переносимой строки?

Я заметил следующее интересное поведение:

$ printf '%s\n' line{1..2} | sed $'1a\\\nPREFIX' line1 PREFIXline2 $ 

Интересно, что это поведение возможно только для последней команды в скрипте Sed, так как для ввода другой команды требуется новая строка.

Он также работает со вставкой:

 $ printf '%s\n' line{1..2} | sed $'1i\\\nPREFIX' PREFIXline1 line2 $ 

На что это зависит?

Я не вижу, чтобы это упоминалось так или иначе в спецификациях POSIX для Sed . Он просто говорит, что text может состоять из одной или нескольких строк. (Если строка не заканчивается символом новой строки, это все еще строка?)

Он также работает с несколькими вставками строк:

 $ printf '%s\n' line{1..2} | sed $'1a\\\n ****/\n1i\\\n/****\\\n * ' /**** * line1 ****/ line2 $ 

Я просто проверил с другим Sed и обнаружил, что это особенность BSD Sed; GNU Sed дает разные результаты, наилучшим образом проиллюстрированные выходом последней приведенной выше команды:

 $ printf '%s\n' line{1..2} | sed $'1a\\\n ****/\n1i\\\n/****\\\n * ' /**** * line1 ****/ line2 $ 

Чтобы префикс строки со строкой, используйте подстановку (замены) и замените ^ :

 $ printf 'line1\nline2\n' | sed '1s/^/PREFIX/' PREFIXline1 line2 

Используйте a чтобы добавить строки после некоторой строки, и i чтобы вставить строку перед другой строкой.

«На что это зависит?» Нет. Как отмечает Стефан Чазелас в комментариях: «Это явно ошибка», а GNU sed не показывает описанное поведение.