Sed - Введение и учебное пособие Брюса Барнетта содержат это в основной команде: s для замены:

Простым примером является замена "день" в "старом" файле на "ночь" в "новом" файле:

sed s/day/night/ <old >new

Или другим способом (для начинающих в UNIX),

sed s/day/night/ old >new

В чем разница? Почему Брюс Барнетт указывает, что один метод "для начинающих UNIX"?

Я вижу, что old используется в качестве ввода в обеих ситуациях, и я вижу, что new используется в качестве вывода в обеих ситуациях. Имеет ли дополнительное < значение?

2 ответа2

4

На практике это мало что меняет. Фактически, первый вариант ограничивает вас одним файлом, а второй позволяет sed объединять несколько входов в один вывод, а также использовать его возможность редактирования на месте.

Техническое отличие состоит в том, что первый метод с < и > опирается исключительно на перенаправление оболочки, универсальную особенность, которой поначалу славился Unix, благодаря своей простоте, а также универсальности и возможности повторного использования во многих программах: оболочка открывает файл и передает его в руки. Вы файл-дескриптор.

(В других системах того времени не было перенаправления полностью или требовалось несколько команд для его активации.)

Последний также перенаправляет вывод, но не ввод. Вместо этого он просит СЭД себя , чтобы открыть входной файл - то , что каждая программа должна осуществлять самостоятельно, возможно , используя несогласованный синтаксис , который вы должны учиться и переучиваться; например, один инструмент может захотеть --input=original.txt --output=processed.txt а другой -in original.txt . Но, как я уже говорил, OTOH более гибок, поскольку вы не ограничены одним входом только для чтения.


Лично, однако, я бы сказал, что группировка 2-го синтаксиса в разделе «... для новичков в Unix» - это либо элитарность, либо педантизм 1980-х годов, того же рода, что и лекция людей об использовании cat foo | bar или подшутить над пользователями Windows & VMS за то, что они "не знакомы с философией Unix".

1

Похоже, Брюс - "потоковый", кто-то, кто верит в то, что "все является потоком байтов", до такой степени, что он считает передачу файлов в качестве параметров, что хотят делать только новички. Несколько причин, по которым я обычно предпочитаю второй способ действий:

  1. Это короче.
  2. Это синтаксически проще.
  3. Это позволяет использовать, например, -i[suffix] для замены на месте без большого количества лишней болтовни для обмена файлами.
  4. Хорошо работает с другими инструментами, такими как xargs .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .