header="/name/of/file/containing/header"
for file in "$@"
do
cat "$header" "$file" > /tmp/xx.$$
mv /tmp/xx.$$ "$file"
done
Вы можете предпочесть разместить временный файл в той же файловой системе, что и файл, который вы редактируете, но все, что требует вставки данных в начало файла, в конечном итоге будет работать очень близко к этому. Если вы собираетесь делать это весь день, каждый день вы можете собрать что-нибудь немного более приятное, но есть вероятность, что экономия будет крошечной (доли секунды на файл).
Если вы действительно, действительно должны использовать sed
, тогда, я полагаю, вы могли бы использовать:
header="/name/of/file/containing/header"
for file in "$@"
do
sed -e "0r $header" "$file" > /tmp/xx.$$
mv /tmp/xx.$$ "$file"
done
Команда читает содержимое заголовка «после» строки 0 (до строки 1), а затем все остальное пропускается без изменений. Это не так быстро, как cat
.
Аналогичная конструкция, использующая awk
:
header="/name/of/file/containing/header"
for file in "$@"
do
awk '{print}' "$header" "$file" > /tmp/xx.$$
mv /tmp/xx.$$ "$file"
done
Это просто печатает каждую строку ввода на выходе; опять же, не так быстро, как cat
.
Еще одно преимущество cat
над sed
или awk
; cat
будет работать, даже если большие файлы в основном представляют собой двоичные данные (это не учитывает содержимое файлов). И sed
, и awk
предназначены для обработки данных, разбитых на строки; хотя современные версии, вероятно, будут обрабатывать даже двоичные данные достаточно хорошо, это не то, для чего они предназначены.