На странице руководства sed говорится следующее:
sed [-Ealnru] command [-I extension] [-i extension] [file ...]
Исходя из этого, я считаю, что должно работать следующее:
sed -E '/^A/d' -i '' tmp.txt
где cat tmp.txt дает:
A
B
Но результат:
sed: -i: No such file or directory
sed: : No such file or directory
B
А tmp.txt остался неизменным.
Чтобы приведенная выше команда работала, мне следует сделать следующее:
sed -E -i '' '/^A/d' tmp.txt
Мой вопрос: почему? Согласно справочной странице, то, что я попробовал первым, должно было сработать. Порядок опций был такой же, как там описано. Однако это не сработало.
Я использую Mac под управлением macOS 12, основанного на FreeBSD.
(см. раздел «Рекомендации по синтаксису утилит» на сайте pubs.opengroup.org/onlinepubs/9699919799/basedefs/…, особенно правило 9)
Пример на странице руководства приведен как sed -i '' -e 's/foo/bar/g' test.txt, что противоречит декларации использования, поэтому, возможно, декларация просто неверна.
Страница руководства кажется несовместимой с реализацией, которая использует getopt(3)
возможно, забавно, но комментарий в исходном коде допускает полное отсутствие команды. например. ls | sed (Синопсис GNU sed это запрещает; синопсис busybox позволяет, но реализация нет)

Рекомендации по синтаксису утилит POSIX указывают, что параметры, включая параметры с параметрами-аргументами, должны идти перед позиционными аргументами. Хотя анализатор командной строки GNUish распознает параметры в более поздних позициях, пока перед ними нет символа конца параметров, такое поведение (как вы заметили) не распространяется надежно на реализации, отличные от GNU.
Это означает, что документация, показывающая -i, идущую после запускаемого выражения, была ошибочной. Измените порядок аргументов следующим образом:
sed -E -i '' '/^A/d' tmp.txt
В качестве подтверждения того, что вы только что сказали, запуск sed -E '/^A/d' -i'' tmp.txt в Ubuntu, который использует GNU bash, работает как положено.
Для инструментов, соответствующих соглашениям о синтаксическом анализе командной строки POSIX, параметры должны идти перед позиционными аргументами. Это означает, что
-i ''должен стоять перед'/^A/d'.