Почему -n, за которым следует переключатель -i в sed, удаляет все?

Быстрый и грязный способ (предполагает двойное чтение файла):

$ tail -n+2 file | paste -d';' file -
A;B
B;C
C;
-1
24.01.2021, 10:43
3 ответа

поman sed

-n, --quiet, --silent
     suppress automatic printing of pattern space

это не полезный способ команды sed. вы можете использовать вот так:

sed -n 's/pattern/replacement/p' "dir"/*

для печати.

sed -n -i 's/pattern/replacement/p' "dir"/*

сохранять только измененные записи

sed -i 's/pattern/replacement/g' "dir"/*

изменить только соответствующие записи

1
18.03.2021, 22:34

sedозначает "s tream ed itor". Это потоковая версия ed, которая является файловым редактором .

Итак, способ, которым sedпредназначен для использования , заключается в том, что он всегда генерирует свой вывод на стандартный вывод. Именно так термин "печать" используется в руководстве, а также в спецификации .

-i— это не -стандартное расширение для редактирования файлов, которое не существует во всех реализациях sedи не гарантирует того же поведения в тех реализациях, которые делают реализовать это. (Например, в моей системе ваша команда выдает ошибку, потому что файл резервной копии требует расширения . т.е. в моей системе мне пришлось бы указать что-то вроде sed -n -i savemybutt 's/pattern/replacement/g' "dir"/*, что затем делало бы резервную копию каждого файла foo.txtв foo.txt.savemybuttперед редактированием.)

Тот факт, что -iне является стандартом -и является запоздалой мыслью, означает, что стандартная терминология в документации по вашей реализации sed(, я предполагаю, что это GNU sed ), никогда не менялась,и, таким образом, он по-прежнему использует термин «печать» для обозначения «генерировать вывод» в общем смысле .

Другими словами :в стандартном режиме работы sedединственным способом генерирования вывода является вывод его на стандартный вывод. Нет возможности редактировать файлы. Поэтому в стандартном режиме работы печать и вывод одинаковы. Как только вы добавите -iв смесь, все станет более туманным, но «печатать» по-прежнему означает «генерировать вывод» в общем смысле , даже если вывод идет в файл, потому что это то, что «печать» всегда означало .

Цель из -nзаключается в том, что только генерирует вывод, который вы явно печатаете, например, с помощью команды p:

sed -n '/<body>/,/<\/body/p' < some_html_document.html

Это напечатает (примерно )элемент bodyHTML-документа. (Это глупый пример, конечно.)

4
18.03.2021, 22:34

Ваше описание -nкажется точным.Однако вы кажетесь менее ясным по -i.

Нормальным поведением является вывод на стандартный вывод. поэтому «я думал, что, используя -n, я только не позволяю sed распечатывать любой текст в стандартный вывод», будет означать, что он перестанет выполнять свою работу.

Затем -iменяет поведение, чтобы сделать это на месте. Но какой-то результат.

Как избежать в будущем

Следующий тест без -i. Таким образом, вывод идет на стандартный вывод :Никаких мутаций не происходит. (функциональное программирование (отсутствие мутаций )безопаснее процедурного ).

И не пишите код, если у вас не проходит тест. (Есть ли у вас какие-либо проблемы, которые выводятся на стандартный вывод?)

2
18.03.2021, 22:34

Теги

Похожие вопросы