Порядок параметров в Unix sed для редактирования файлов на месте

На странице руководства 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.

Для инструментов, соответствующих соглашениям о синтаксическом анализе командной строки POSIX, параметры должны идти перед позиционными аргументами. Это означает, что -i '' должен стоять перед '/^A/d'.

Charles Duffy 25.03.2024 17:28

(см. раздел «Рекомендации по синтаксису утилит» на сайте pubs.opengroup.org/onlinepubs/9699919799/basedefs/…, особенно правило 9)

Charles Duffy 25.03.2024 17:40

Пример на странице руководства приведен как sed -i '' -e 's/foo/bar/g' test.txt, что противоречит декларации использования, поэтому, возможно, декларация просто неверна.

tjm3772 25.03.2024 17:46

Страница руководства кажется несовместимой с реализацией, которая использует getopt(3)

jhnc 25.03.2024 17:48

возможно, забавно, но комментарий в исходном коде допускает полное отсутствие команды. например. ls | sed (Синопсис GNU sed это запрещает; синопсис busybox позволяет, но реализация нет)

jhnc 25.03.2024 17:58
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
5
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Рекомендации по синтаксису утилит POSIX указывают, что параметры, включая параметры с параметрами-аргументами, должны идти перед позиционными аргументами. Хотя анализатор командной строки GNUish распознает параметры в более поздних позициях, пока перед ними нет символа конца параметров, такое поведение (как вы заметили) не распространяется надежно на реализации, отличные от GNU.

Это означает, что документация, показывающая -i, идущую после запускаемого выражения, была ошибочной. Измените порядок аргументов следующим образом:

sed -E -i '' '/^A/d' tmp.txt

В качестве подтверждения того, что вы только что сказали, запуск sed -E '/^A/d' -i'' tmp.txt в Ubuntu, который использует GNU bash, работает как положено.

Mehrshad Khansarian 25.03.2024 21:07

Другие вопросы по теме