Быстрый и грязный способ (предполагает двойное чтение файла):
$ tail -n+2 file | paste -d';' file -
A;B
B;C
C;
по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"/*
изменить только соответствующие записи
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
Это напечатает (примерно )элемент body
HTML-документа. (Это глупый пример, конечно.)
Ваше описание -n
кажется точным.Однако вы кажетесь менее ясным по -i
.
Нормальным поведением является вывод на стандартный вывод. поэтому «я думал, что, используя -n, я только не позволяю sed распечатывать любой текст в стандартный вывод», будет означать, что он перестанет выполнять свою работу.
Затем -i
меняет поведение, чтобы сделать это на месте. Но какой-то результат.
Следующий тест без -i
. Таким образом, вывод идет на стандартный вывод :Никаких мутаций не происходит. (функциональное программирование (отсутствие мутаций )безопаснее процедурного ).
И не пишите код, если у вас не проходит тест. (Есть ли у вас какие-либо проблемы, которые выводятся на стандартный вывод?)